Tournevia

CSV formats

Columns, units and rules for importing deliveries and vehicles, and the content of the dispatch export.

1. Rules shared by both imports

  • The file is UTF-8, comma-separated, with one header row. A UTF-8 byte-order mark is accepted. A file separated by semicolons, as a spreadsheet set to French conventions often saves CSV, is refused: save it again with commas.
  • The headers must match the lists below exactly and in this order. Keep the technical column names in English, also in a French file. Optional columns can follow, in the order stated for each file.
  • At most 250 data rows and 1 MiB per file.
  • active is true or false, in lowercase.
  • Whole numbers use digits only: no sign, decimal separator, space or unit.
  • Equipment codes are separated by |. Each code starts with a capital letter and uses only A–Z, 0–9 and _, up to 40 characters; at most 30 codes per record, without repeats. Leave the cell empty for no equipment. On screen, including the import preview, TAIL_LIFT reads Tail lift and REFRIGERATED reads Refrigerated body; other codes are shown as written.
  • Customer, depot and place codes are the ones saved in Tournevia (Customers, Settings › Depots and places). An unknown code is an error.

2. Delivery file

ColumnContentRule
external_idYour delivery identifier1–100 characters, unique in the company. May be left empty when delivery numbering is set up: the row receives the next number
service_dateDelivery dayRequired, YYYY-MM-DD
activeWhether the delivery can be selectedtrue or false
addressAddress or entrance description1–500 characters; may be left empty when the row names a customer in customer
latitudeEntrance latitudeDecimal with a point, −90 to 90; empty with longitude if unknown
longitudeEntrance longitudeDecimal with a point, −180 to 180; empty with latitude if unknown
time_window_startEarliest service timeRequired, ISO 8601 with offset, on service_date
time_window_endLatest service timeRequired, after the start, on service_date
service_secondsTime spent at the stop, in seconds0–28800
weight_kgWeight, in kgWhole number ≥ 0
volume_dm3Volume, in dm³ (litres)Whole number ≥ 0
pallet_eur_unitsEuro palletsWhole number ≥ 0
pallet_ind_unitsIndustrial palletsWhole number ≥ 0
loading_length_mmLoading length, in mmWhole number ≥ 0
required_skillsEquipment the vehicle must haveCodes separated by |, or empty
instructionsDelivery instructionsUp to 1000 characters; may be empty
priorityOptional column0–100; an empty cell means 0
customerOptional column: code of a saved customerEmpty for no customer
ships_fromOptional column: code of the depot the delivery is loaded atA depot, not another place; empty: any vehicle

The optional columns follow in the order priority, customer, ships_from. A file may stop after any of them: priority alone, priority,customer, or all three.

Times are ISO 8601 with their UTC offset, in Europe/Paris local time, to the second, for example 2026-09-23T08:00:00+02:00. A time that does not exist in Paris, or an offset that does not match the date, is refused. A delivery ships only from a depot: ships_from cannot name a place such as a driver’s home, nor an example depot.

Example row from the kit’s examples/orders.csv:

DEMO-ORDER-001,2026-09-23,true,"Synthetic delivery entrance A, Paris",48.841,2.386,2026-09-23T08:00:00+02:00,2026-09-23T11:30:00+02:00,1200,1820,6900,4,0,3200,TAIL_LIFT|REFRIGERATED,Fictional fixture. Do not dispatch.

Where each delivery’s point comes from

The preview says where each row’s point comes from, and counts them under Delivery points:

  • Point from the file: the row’s own coordinates. They arrive unreviewed: review each entrance before calculating.
  • Entrance of customer …: the row has no coordinates and names a saved customer in customer, or its address is exactly an active customer’s (ignoring case and spacing). The row takes the customer’s saved entrance. Only a customer’s reviewed entrance arrives reviewed.
  • Found from the address · match N %: when address search is on, a row without coordinates or customer gets a proposed point if the lookup finds a house number or a street with a match of at least 60 %. The point is at the building and arrives unreviewed: review the entrance. The lookups for one file have 20 seconds in total; if the lookup is unavailable or runs out of time, the preview says so and the remaining rows have no point.
  • No point: the delivery is imported with Location missing; place its pin after the import.

Address search is on when the installation has its own address service, or when an administrator turns on IGN’s service in Settings › Address search.

Rows to check

The preview flags rows to check without blocking the import. They are counted under Rows to check, and Only rows to check shows them alone. A row is flagged when:

  • its delivery date is in the past;
  • its address was not found, or the lookup found only the town or an uncertain match;
  • its latitude and longitude look swapped;
  • its point is more than 100 km from the depot it ships from, or from the nearest of your depots;
  • the same address has another point more than 300 m away in the file;
  • its point is more than 50 m from its customer’s saved entrance.

The exact wording is in Messages and what to do.

3. Vehicle file

ColumnContentRule
fleet_numberYour vehicle identifierRequired, 1–40 characters, unique in the company
activeWhether the vehicle can be selectedtrue or false
height_mmTruck height, in mm1–10000
width_mmTruck width, in mm1–10000
length_mmTruck length, in mm1–50000
gross_weight_kgGross weight used for road routing, in kg1–100000
axle_load_kgAxle load, in kg1–40000
axle_countNumber of axles2–12
weight_kgPayload weight capacity, in kgWhole number ≥ 0, at most gross_weight_kg
volume_dm3Volume capacity, in dm³Whole number ≥ 0
pallet_eur_unitsEuro pallet capacityWhole number ≥ 0
pallet_ind_unitsIndustrial pallet capacityWhole number ≥ 0
loading_length_mmLoading length capacity, in mmWhole number ≥ 0
skillsEquipment the vehicle hasCodes separated by |, or empty
monday … sundayWorking hours for each weekday, one column per day: monday, tuesday, wednesday, thursday, friday, saturday, sunday07:30-17:00, Paris local time; the end follows the start on the same day. Empty: the vehicle does not work that day
fixed_minorFixed cost per route, in euro centsWhole number ≥ 0
per_km_minorDistance rate, in euro cents per kmWhole number ≥ 0
per_hour_minorTime rate, in euro cents per hourWhole number ≥ 0
max_stopsOptional column1–250; empty for no limit
max_distance_mOptional column, in metres1–2000000; empty for no limit
max_driving_secondsOptional column, in seconds1–90000; empty for no limit
startOptional column: code of the depot or place where the vehicle starts and is loadedEmpty: the main depot
endOptional column: code of the depot or place where it ends its dayEmpty: where it started

The optional columns come in groups: none, the three limits, or the three limits followed by start,end. A vehicle of your fleet cannot start or end at an example depot.

Days off and other hours on a date are not in the file: enter them in Fleet. Importing the vehicle again keeps them. Overnight work is unsupported.

Example row from the kit’s examples/vehicles.csv (Monday to Friday, 07:30–17:00):

TRUCK-DEMO-01,true,3600,2550,9600,19000,11500,2,9500,42000,18,0,7200,TAIL_LIFT|REFRIGERATED,07:30-17:00,07:30-17:00,07:30-17:00,07:30-17:00,07:30-17:00,,,8500,72,3250

4. Preview and import

  1. In Deliveries or Fleet, choose Import CSV, then drop your file on the marked area, or click it to choose the file.
  2. Choose Preview CSV. Preview saves nothing.
  3. Read the counts New, Changed, Unchanged, Rows to check (for deliveries) and Rows with errors, then the messages per row and column.
  4. Correct the file, choose it again and preview until no row has an error.
  5. Choose Import deliveries or Import vehicles. The rows are saved together, in one step.
  6. After a delivery import, Review the imported points and Place the missing points open the matching deliveries.

Before a file is chosen, the import panel shows its steps — 1 Choose file, 2 Preview, 3 Import and, for deliveries, 4 Review locations — with the current one marked, and Columns of the file: the exact header row, with the optional columns set apart. Copy the header row copies it. Download the template saves a CSV file holding only that row (tournevia-deliveries.csv or tournevia-vehicles.csv), in UTF-8 with a byte-order mark so that a spreadsheet keeps accents. The template has every optional column: when you import a corrected file again, an empty cell in one of them restores its default.

Any error blocks the whole file: nothing is saved until every row is valid. A wrong header row is reported as “Expected exact headers: …, optionally followed by: …” with the two expected lists. A file separated by semicolons is reported as “This file separates its columns with semicolons; Tournevia reads commas. Save it with commas as separators, then preview it again.” Other file-level messages are listed in Messages and what to do.

Import a corrected file again

An identifier that already exists no longer blocks the import:

  • A row with the same values is Unchanged and keeps the existing record, including its entrance review.
  • A row with different values is Changed. The preview names what it changes, for example “Service duration · Service window”. The change is saved only when you confirm the import.
  • A changed delivery without coordinates in the file keeps its saved point and its review (Saved point kept). The same point given again keeps its review too; a moved point must be reviewed again.
  • An optional column missing from the file keeps the saved values: priority, customer and ships_from for a delivery, the route limits and start, end for a vehicle. An empty cell in a column the file has restores the default, like any other change.
  • A changed vehicle keeps its days off.

Through the API, a row for an existing record is still refused unless update_existing=true is sent.

5. Dispatch export

Export CSV downloads the current Ready plan as plan-<plan id>-v<version>.csv, one row per served stop, in route order. Unassigned deliveries are not in the file. Every download checks again that the plan is Ready, current and valid.

ColumnContent
plan_id, plan_versionThe exported plan and its version
exported_atTime of the download
service_datePlanned day
vehicleFleet number
vehicle_departure, vehicle_returnThe vehicle’s departure and the end of its route
start_place, end_placeCodes of the depot or place where the route starts and ends
sequenceStop number within the route, from 1
order, addressDelivery identifier and address
latitude, longitudeReviewed entrance coordinates
time_window_start, time_window_endThe delivery’s service window
arrival, service_start, stop_departurePlanned arrival, start of service and departure at the stop
service_secondsService duration, in seconds
weight_kg, volume_dm3, pallet_eur_units, pallet_ind_units, loading_length_mmThe delivery’s quantities
required_skillsRequired equipment codes, separated by |
instructionsDelivery instructions
planning_notice“Planning estimate. Verify current road access and driver requirements. Tolls are not included.”

All times are Europe/Paris ISO 8601 with their offset. The planning notice is written in your account language; for a plan of examples it starts with “Example data, not for driving.”. Delivery columns carry the same names as the delivery import.

The interface chooses the layout from its language:

  • English interface: UTF-8 with commas.
  • French interface: UTF-8 with a byte-order mark, semicolons and a decimal comma in the coordinates, for spreadsheet programs that use a decimal comma, such as French Excel.

Text cells that start with =, +, - or @ (also after spaces) are written with a leading apostrophe, so a spreadsheet does not run them as formulas. If you edit a plan after exporting it, it returns to Draft: mark it Ready again and replace the file everyone received.

On this page