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.
activeistrueorfalse, 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 onlyA–Z,0–9and_, 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_LIFTreads Tail lift andREFRIGERATEDreads 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
| Column | Content | Rule |
|---|---|---|
external_id | Your delivery identifier | 1–100 characters, unique in the company. May be left empty when delivery numbering is set up: the row receives the next number |
service_date | Delivery day | Required, YYYY-MM-DD |
active | Whether the delivery can be selected | true or false |
address | Address or entrance description | 1–500 characters; may be left empty when the row names a customer in customer |
latitude | Entrance latitude | Decimal with a point, −90 to 90; empty with longitude if unknown |
longitude | Entrance longitude | Decimal with a point, −180 to 180; empty with latitude if unknown |
time_window_start | Earliest service time | Required, ISO 8601 with offset, on service_date |
time_window_end | Latest service time | Required, after the start, on service_date |
service_seconds | Time spent at the stop, in seconds | 0–28800 |
weight_kg | Weight, in kg | Whole number ≥ 0 |
volume_dm3 | Volume, in dm³ (litres) | Whole number ≥ 0 |
pallet_eur_units | Euro pallets | Whole number ≥ 0 |
pallet_ind_units | Industrial pallets | Whole number ≥ 0 |
loading_length_mm | Loading length, in mm | Whole number ≥ 0 |
required_skills | Equipment the vehicle must have | Codes separated by |, or empty |
instructions | Delivery instructions | Up to 1000 characters; may be empty |
priority | Optional column | 0–100; an empty cell means 0 |
customer | Optional column: code of a saved customer | Empty for no customer |
ships_from | Optional column: code of the depot the delivery is loaded at | A 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
| Column | Content | Rule |
|---|---|---|
fleet_number | Your vehicle identifier | Required, 1–40 characters, unique in the company |
active | Whether the vehicle can be selected | true or false |
height_mm | Truck height, in mm | 1–10000 |
width_mm | Truck width, in mm | 1–10000 |
length_mm | Truck length, in mm | 1–50000 |
gross_weight_kg | Gross weight used for road routing, in kg | 1–100000 |
axle_load_kg | Axle load, in kg | 1–40000 |
axle_count | Number of axles | 2–12 |
weight_kg | Payload weight capacity, in kg | Whole number ≥ 0, at most gross_weight_kg |
volume_dm3 | Volume capacity, in dm³ | Whole number ≥ 0 |
pallet_eur_units | Euro pallet capacity | Whole number ≥ 0 |
pallet_ind_units | Industrial pallet capacity | Whole number ≥ 0 |
loading_length_mm | Loading length capacity, in mm | Whole number ≥ 0 |
skills | Equipment the vehicle has | Codes separated by |, or empty |
monday … sunday | Working hours for each weekday, one column per day: monday, tuesday, wednesday, thursday, friday, saturday, sunday | 07:30-17:00, Paris local time; the end follows the start on the same day. Empty: the vehicle does not work that day |
fixed_minor | Fixed cost per route, in euro cents | Whole number ≥ 0 |
per_km_minor | Distance rate, in euro cents per km | Whole number ≥ 0 |
per_hour_minor | Time rate, in euro cents per hour | Whole number ≥ 0 |
max_stops | Optional column | 1–250; empty for no limit |
max_distance_m | Optional column, in metres | 1–2000000; empty for no limit |
max_driving_seconds | Optional column, in seconds | 1–90000; empty for no limit |
start | Optional column: code of the depot or place where the vehicle starts and is loaded | Empty: the main depot |
end | Optional column: code of the depot or place where it ends its day | Empty: 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,32504. Preview and import
- In Deliveries or Fleet, choose Import CSV, then drop your file on the marked area, or click it to choose the file.
- Choose Preview CSV. Preview saves nothing.
- Read the counts New, Changed, Unchanged, Rows to check (for deliveries) and Rows with errors, then the messages per row and column.
- Correct the file, choose it again and preview until no row has an error.
- Choose Import deliveries or Import vehicles. The rows are saved together, in one step.
- 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,customerandships_fromfor a delivery, the route limits andstart,endfor 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.
| Column | Content |
|---|---|
plan_id, plan_version | The exported plan and its version |
exported_at | Time of the download |
service_date | Planned day |
vehicle | Fleet number |
vehicle_departure, vehicle_return | The vehicle’s departure and the end of its route |
start_place, end_place | Codes of the depot or place where the route starts and ends |
sequence | Stop number within the route, from 1 |
order, address | Delivery identifier and address |
latitude, longitude | Reviewed entrance coordinates |
time_window_start, time_window_end | The delivery’s service window |
arrival, service_start, stop_departure | Planned arrival, start of service and departure at the stop |
service_seconds | Service duration, in seconds |
weight_kg, volume_dm3, pallet_eur_units, pallet_ind_units, loading_length_mm | The delivery’s quantities |
required_skills | Required equipment codes, separated by | |
instructions | Delivery 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.