Bulk Import (CSV)
Suppliers, their properties, every rate table and your tours can be loaded from a spreadsheet instead of typed one at a time. The pattern is the same everywhere — download a sample or an export, fill it in, import it — and the differences that matter are in the table below. Everything imports into your own agency’s data and nowhere else, and only admins and managers can import.
Sample → Export → Import
- Sample — the right column headers and an example row, so you never guess the shape.
- Export — what is in the app now, in the same shape. Edit it and import it to change many records at once.
- Import — reads a filled-in sheet back in.
Screenshot: The Import / Export menu on the Suppliers directory
How each sheet imports
| Suppliers | Supplier properties | Rates | |
|---|---|---|---|
| Where | Suppliers → Import / Export: Sample sheet · Export suppliers · Import suppliers | Suppliers → Import / Export: Export properties · Import properties (no sample: start from an export) | Every rate page: Sample CSV · Export CSV · Import CSV |
| A row matches | its Code, else its Name | its Property ID, else the same supplier, kind and name | its key — the Service Code on most sheets; Cruise Code on cruises; route, service type, city and vehicle on transportation; Name on extras; Cost Type on fixed costs |
| Matched | updated | updated | updated |
| Not matched | created, with the next SUP-#### if it has no code | created under its supplier | created. A row with no code is matched on what identifies the rate (a hotel by name, city, tier and board; a meal by restaurant, meal, city and tier …) and updates it |
| A blank cell | leaves the stored value | clears the field (a column the sheet lacks is left alone) | leaves the stored value |
| A row with a problem | refused; the rest import | refused; the rest import | the whole file is refused — fix every row first; the preview lists them |
| Preview before import | no | no | yes |
Codes and keys match whatever their letter case. Tours have their own two sheets and rules — see Importing Tours.
What a sheet does and does not carry
A row carries flat facts — names, types, contact details, prices, and lists separated with semicolons. A record with children of its own gets a second sheet for them, one row each: a supplier’s properties, a tour’s days. Some lists fit in one cell: a supplier’s several roles (hotel | transport_company), its properties’ names (hotel:Nile Star | ship:MS Hapi), an activity’s group-size bands (1-4:25; 5-8:40), a cruise’s sailing days (mon;fri).
Nothing is guessed
- Words from your vocabulary (types, tiers, board basis, vehicles, seasons) may be written as you see them on the form or as the key behind them. One that matches nothing is refused.
- Numbers and yes/no cells are checked: “ten” or “ture” is refused, not stored as 0 or false. Yes/no accepts true/false, yes/no, y/n and 1/0.
- Duplicates are refused. Two rows with the same code or key in one file, or a rate key that two of your stored rates share (one row would overwrite both).
- Headers. The supplier and property sheets accept common variants of a column name; rate sheets want the column names as the sample and export write them. Columns an import does not read are ignored.
- The example row is skipped. The sample’s example row (a code beginning
EXAMPLE-) is never imported, so a sample uploaded unedited creates nothing — and a rates file holding only the example says so. - Preferred. A rate sheet that stars a hotel, ship or restaurant as Preferred takes the star from the one that had it, as the star on the page does.
Rates and the supplier code
Rate sheets that link a supplier carry a supplier code column, so each rate re-attaches to the right supplier. A code your agency does not have is reported and that row skipped — import the supplier first (or fix the code), then import again. A row with no code but a supplier name is linked by the name when exactly one supplier has it, and reported when not. Why codes matter: Suppliers.