Map Transport
Map raw rows into the scenario's flows table: the movements that were actually observed between locations. Each record is product that moved from a source to a target, with its quantity and its realized cost.
Network Optimization does not read flows. It reads lanes. Transport is observed history; lanes are what is allowed. If you only have historical shipments and need an optimization, build a lanes table from your location pairs with Map Lanes.
When to use this¶
- You have historical shipment data and want a baseline scenario that preserves what flowed
- You're comparing an optimized network against the as-is and need realized flows to compare against
- You want Consolidate Shipments to measure how few transports a shipment history fits on
What you need¶
- An upstream Import Data node carrying one row per shipment, or one row per source-target-product combination if it is pre-aggregated
- Origin and destination columns whose values match identifiers in the locations table
Field mapping¶
Fields are matched by name unless you set them. When the workflow runs, every field you have not set a column for is matched against the headers listed below, case-insensitively and ignoring spaces around the header, and a space inside your header reads as an underscore, so Site Name matches site_name. Setting a column for one field fixes that field only; the others keep following your file's headers, so a renamed column is still found. A required field that no column supplies — no header matched, or you set none or one your table lacks — is reported once, with the headers your table does have.
Set mappings in the node's panel. Connect an upstream table and select the mapping node. A field matched by name is marked Matched by name; pick a column to set it yourself, and Match by name puts it back. Match all by name clears every field you set. Required fields without a match are marked in the panel.
Reshape rows in a Script first. A mapping node only says which column is which field. To drop rows, recode values, or split or combine columns, connect a Script node before it and map the columns the Script returns.
Same for every row. A file with no unit column still states its unit: in Quantity Unit or Load Unit, pick Same for every row and type the unit, such as units, and every row is in it. Over MCP, set it in field_mappings as "quantity_unit": "__const__:units". Quantity Unit is required on every row with Quantity or Unit Cost, and the panel marks it required once one of those is mapped.
| Field | Type | Required | Example | What it is | Auto-detected headers |
|---|---|---|---|---|---|
| Source | text | Yes | Warehouse A |
Origin location name | source, from, origin, source_id, from_id |
| Target | text | Yes | Store 1 |
Destination location name | target, to, destination, dest, target_id, to_id |
| Product | text | Yes | Widget |
Product or SKU moved. Required — name it even in a single-product scenario. Must match a Product name. | product, sku, item, material, product_id |
| Quantity | number | No | 100.0 |
Quantity moved on this flow. Counted once per flow, so goods that cross two lanes on the way to a customer are counted on each, and a total over flows is goods moved rather than goods delivered. Must be greater than or equal to 0. Its unit goes in Quantity Unit. | quantity, qty, amount, volume, units |
| Quantity Unit | text | No | units |
Unit the quantity and the cost per unit are in. Required on every row that carries one. A unit other than the scenario's needs a conversion for the product. | quantity_unit, qty_unit, unit, uom |
| Transport Cost | number | No | 500.0 |
Transport cost alone — what moving the goods on this flow costs, denominated in the scenario currency. It is not the whole cost of the scenario; handling, supply, production, inventory carrying and fixed site costs are recorded separately and are not in it. Negative amounts record credits against this cost. | cost, transport_cost, shipping_cost, freight_cost, price |
| Emissions | number | No | 12.5 |
Carbon emissions of moving the goods on this flow, in the scenario's emissions unit, set on Create Scenario. Transport only; the emissions of supplying the goods are recorded separately and are not in it. Must be greater than or equal to 0. | emissions, co2, carbon, ghg, carbon_emissions |
| Transport Mode | text | No | FTL |
Transport mode (e.g., FTL, LTL, rail, ocean, air) | transport_mode, mode, shipping_mode, carrier_type, shipment_mode, transport_type |
| Date | text | No | 2025-01-02 |
When this movement happened, stored as YYYY-MM-DD. Dates written DD.MM.YYYY, DD/MM/YYYY or MM/DD/YYYY, and Excel date numbers, are converted; the Read as setting under this field decides a column like 01/02/2026. Blank on a flow the optimizer produced, which is a rate rather than a dated shipment. | date, shipment_date, transport_date, departure_date, dispatch_date, delivery_date, created_on |
| Unit Cost | number | No | 5.0 |
Per-unit transport cost, denominated in the scenario currency. A rate rather than an amount, so totalling it across flows means nothing; total the transport cost instead. Must be greater than or equal to 0. | unit_cost, cost_per_unit, rate, freight_rate, transport_rate |
| Load | number | No | 18500.0 |
A second measure of the movement, the one that fills the vehicle — gross weight, loading metres or volume. Name which in the load unit. Must be greater than or equal to 0. Its unit goes in Load Unit. | load, weight, gross_weight, net_weight, loading_metres, loading_meters, ldm, cbm, chargeable_weight |
| Load Unit | text | No | kg |
Unit for the load measure (e.g., kg, ldm, m3) | load_unit, weight_unit, volume_unit, ldm_unit |
| Reference | text | No | SH-0001234 |
The shipment or transport number this movement is known by in the source system. Blank on a flow the optimizer produced, which is a rate rather than a document. | reference, shipment_number, shipment_id, transport_id, transport_number, delivery_number, document_number, consignment_id, waybill |
How it works¶
Each row becomes a transport record. Create Scenario writes them into the scenario's flows table, which is where realized quantities, costs and emissions show up on dashboards and the map. Cost to Serve reads the Transport Cost column from here.
Consolidate Shipments reads this table as a shipment history: one row per movement that happened, with its Date, its Reference and its Load. Rows that agree on source, target, product, transport mode, date and reference are kept, with a warning, and the map shows them as one flow, added up. Map each shipment's Reference and Date so that two shipments on one lane stay apart.
Emissions are in the scenario's one emissions unit, the Emissions Unit set on Create Scenario. A scenario whose flows carry emissions without that setting is refused. Create Scenario stores its unit with every flow carrying emissions. Map the figure only; an emissions unit column is not mapped, and nothing is converted.
For an optimization-only workflow that preserves no baseline you can skip Map Transport entirely. The optimizer needs lanes plus the policy tables.
Dates¶
Dates are saved as YYYY-MM-DD. A date written 13.01.2026, 13/01/2026, 01/13/2026 or 20260113, or an Excel date number such as 46023, is converted when the node runs. A time after the date is dropped.
A date like 01/02/2026 could be 1 February or 2 January. The node reads the whole column to decide: one date such as 13/01/2026 settles it as day first. A dotted date (13.01.2026) is read day first unless you choose an order, and does not decide the column for the other dates. When nothing in the column settles it, or the column holds both orders, the node stops and names the rows; the run report's Choose date format opens the node at its Date field. To decide it yourself, set Read as under the Date field to Day First (01/02 is 1 February) or Month First (01/02 is 2 January). A chosen order applies to dotted dates too, and every date that does not fit it is reported by row.
You see this before you run. With the Date field mapped to a column of an uploaded file, the field shows a few of your dates as the node will read them (01/02/2025 → 1 Feb 2025), and the row that settled the order. It reads the whole file to say so, so it answers as the run will. When another node sits between the file and this one, it changes the rows, and the run decides.
A value that is not a date stops the node too, naming its row and value.
Workflow wiring¶
flowchart LR
n1["Import Data (locations.csv)"] --> n2["Map Locations"]
n3["Import Data (shipments.csv)"] --> n4["Map Transport"]
n4 --> n5["Create Scenario"]
n6["Import Data (lanes.csv)"] --> n7["Map Lanes"]
n2 --> n5
n7 --> n5
n8["Import Data (products.csv)"] --> n9["Map Products"]
n9 --> n5
Common mistakes¶
- Source or target names that do not match locations. Create Scenario refuses a row naming a location the locations table does not hold, and names the rows. Standardize names before mapping.
- Mapping a per-unit rate to Transport Cost. It is the total for that flow. A per-unit rate goes in Unit Cost.
- Using this table to drive Network Optimization. The optimizer reads lanes.
Messages this node can show¶
- Date not readable
- Day and month order unclear
- Field matches several columns
- Mapped table empty
- Number outside its allowed bound
- Required field absent
- Row doesn’t fit its table
- Text padded with spaces
- Value not a plain number
The table this node makes is checked again with the rest of the scenario when Create Scenario assembles it: see messages about the scenario.
A run gives this node 5 minutes. A node that takes longer stops with Time limit reached.
Like every node, it can also stop on the checks before a run and the run's limits.