CSV Import - End to End Guide
Learn how to efficiently import CSV files for streamlined data management and analysis in your applications.
Table of Contents
Bulk Import Trips via CSV
Bulk trip import allows dispatchers to efficiently create multiple trips in Tobi by uploading a properly formatted CSV file. This article explains how to upload, map, monitor, and understand system rules for trip imports.
Navigate to Trip Import
Go to: Operations → Trip Import Trips
This screen allows you to:
- Upload new trip files
- Track upload history
- Download error logs
- Monitor processing status

Upload History — Field Definitions
- The upload history table displays all files uploaded to the system.
- Unique system identifier for each uploaded file.
Upload Date
Timestamp showing when the file was uploaded.
Uploaded By
Name of the user who uploaded the file.
Total Records / Unprocessed
- Total Records = Total rows present in the CSV file (each row = one record).
- Unprocessed = Number of records that were not processed (trips were not created due to failures).
Success / Failures
- Success = Records for which trips were successfully created.
- Failures = Records for which trips were not created.
Logs
Downloadable error log containing:
- Only failed records
- Failure reason in the last column
- Provided as a CSV file
Status
Indicates the processing state of the file.
Possible values:
- Success — File uploaded successfully
- Draft — File saved in draft mode
- Success (Partially Successful) — File processed but contains failures (error log available)

How to Import Your CSV File
Step 1 — Start a New Upload
Navigate to: Operations → Trip Import Trips → New Upload. You will be taken to the Upload Bookings screen.
Required Field
Fleet: - Select the fleet for which trips should be created
Optional Field
Account: - Use this when uploading trips for a single account.
If uploading for multiple accounts:
- Do NOT select an account on the upload screen
- Instead, include Account Code in the CSV
- Map it during the mapping step
How to Find Account Code
Go to: Configurations → Accounts → Select Account → 3 dots → Edit
The account code is located under Basic Information if it was entered. If not entered, enter an account code and save it at the account level to be used later.
Example:
| Account | Code |
|---|---|
| New York State Hospital | 001 |
| New Jersey State Hospital | 002 |

In the CSV:
- Add an Account Code column
- Map it during upload
- System will create trips for the corresponding account per record
Step 2 — Upload File and Configure Mapping
- Upload the CSV
- Click Continue
- You will be redirected to the Mapping Screen
- You can:
- Create a new mapping
- Use an existing template
- Clone and modify an existing template once exsiting template is selected

Step 3 — Create a New Mapping Template
Add Mapping Name
- Provide a unique name. This template will be saved for future use.
How to Match Legs
The system requires a unique passenger identifier to correctly group and sequence legs.
You can use any of the following approaches.
Method 1 — Same Invoice Number
Use a column that identifies multiple legs of the same client.
Example:
| Invoice | From | To |
|---|---|---|
| 1234466 | A | B |
| 1234466 | B | A |
Leg determination logic:
- Based on pickup time or dropoff time
- The latter time becomes Leg-B
Method 2 — Client Identification
Use a unique identifier per passenger, such as:
- Member ID
- Trip ID
- MRN
Method 3 — Alphabetical Leg Sequence
Example values:
- 4647-A
- 4647-B
The system recognizes these as legs of the same booking.
Client Information Mapping
| Field | Required | Definition | Example |
|---|---|---|---|
| Member ID | No | Unique identifier for the passenger from the source system. Helps prevent duplicate profiles. | MBR12345 |
| Full Name | No | Passenger’s complete name in a single column. Use instead of first/last name if available. | John A. Doe |
| First Name | Yes* | Passenger’s first name. Required if Full Name is not used. | John |
| Last Name | Yes* | Passenger’s last name. Required if Full Name is not used. | Doe |
| Middle Name | No | Passenger’s middle name or initial. | Allen |
| No | Passenger’s email address. | john.doe@email.com | |
| Date of Birth | No | Passenger’s DOB in supported date format. | 01/15/1980 |
| Gender | No | Passenger’s gender. | Male |
| Primary Phone Number | Yes | Main contact number for the passenger. Used for duplicate detection. | 3155558899 |
| Secondary Phone Number | No | Additional contact number. | 3155557777 |
| Client Notes Public | No | Notes visible to drivers and dispatchers. | Needs front door pickup |
| Client Notes Private | No | Internal notes visible only to dispatchers. | VIP client |
| Client SSN | No | Social Security Number of the passenger. | 123-45-6789 |
| Alias Name | No | Nickname or alternate name of passenger. | Johnny |
*Required when Full Name is not mapped
Pickup & Dropoff Information Mapping
Time and Date Fields
| Field | Required | Definition | Example |
|---|---|---|---|
| Time Only | No | Column containing only time in HH:MM format. | 14:30 |
| Date Only | Yes | Column containing only date in DD/MM/YYYY format. | 25/12/2025 |
| Pickup Time (DateTime) | Conditionally | Combined pickup date and time in one column. | 14:30 25/12/2025 |
Note: At least one valid time configuration is recommended. If none are mapped, trips become Will Call.
Pickup Location Fields
| Field | Required | Definition | Example |
|---|---|---|---|
| Pickup Address 1 | Conditionally | Street address line 1. Required if full address is not mapped. | 116 Martin Luther King E |
| Pickup Address 2 | No | Additional address details. | Suite 200 |
| Pickup City | Conditionally | City of pickup location. | Syracuse |
| Pickup State | Conditionally | State of pickup location. | NY |
| Pickup Zip | Conditionally | ZIP/postal code. | 13205 |
| Pickup Unit/Apt | No | Apartment or unit number. | Apt 4B |
| Pickup Address (Full) | Recommended | Full formatted pickup address in one field. If used, individual fields are not required. | 116 Martin Luther King E, Syracuse, NY 13205 |
Condition rule: Either full address OR the broken-down components must be mapped.
Dropoff Location Fields
| Field | Required | Definition | Example |
|---|---|---|---|
| Dropoff Address 1 | Conditionally | Street address line 1 for dropoff. | 500 State St |
| Dropoff Address 2 | No | Additional dropoff details. | Floor 3 |
| Dropoff City | Conditionally | City of dropoff location. | Syracuse |
| Dropoff State | Conditionally | State of dropoff location. | NY |
| Dropoff Zip | Conditionally | ZIP/postal code. | 13202 |
| Dropoff Unit/Apt | No | Apartment or unit number. | Suite 12 |
| Dropoff Address (Full) | Recommended | Full formatted dropoff address. | 500 State St, Syracuse, NY 13202 |
Condition rule: Either full address OR the broken-down components must be mapped.
Trip Information Mapping
| Field | Required | Definition | Example |
|---|---|---|---|
| Leg Notes | No | Notes specific to a trip leg. | Patient prefers the rear entrance |
| Booking Fare | No | Manually entered fare that overrides price rules. | 45.00 |
| Mode | No | Transportation mode required for the trip. | Van |
| Booking Notes Private | No | Internal booking notes visible only to dispatchers. | Call facility before arrival |
| Distance | No | Predefined trip distance (if provided externally). | 12.5 |
| Vendor ID | Conditional | Unique numeric identifier per passenger when used as leg identifier. | 123456 |
| Booking Notes Public | No | Notes visible to both driver and dispatcher. | Ring bell on arrival |
| Seating Needs | No | Passenger seating requirement. | Wheelchair |
| Authorization Number | No | Authorization or approval number for the trip. | AUTH78945 |
| Tags | No | Tags applied at trip level. Multiple allowed. | dialysis, recurring |
| Trip Purpose | No | Purpose of the trip. | Appointment |
| Companion | No | Flag to create a companion booking. | Yes |
| Service Type | No | Service classification applied to the trip. | Assisted |
| Account Code | Conditional | Required when account is not selected on upload screen. | 001 |
Important Notes
- Passenger name and primary phone are mandatory overall.
- Pickup and drop-off addresses are mandatory overall.
- Missing pickup/dropoff times → trips created as Will Call.
- Account Code is required only when uploading for multiple accounts.
Special Requirement Section
This section is optional.
- If your CSV already includes seating needs: Map it directly
- Remove the unused section using the trash icon
Step 4 — Preview and Save
After mapping:
- Click Preview
- Click Save to start import
- Or Save as Draft
Draft Behavior
Draft uploads appear in the upload history, You can later:
- Click the pencil icon
- Submit the draft for processing
System Rules for CSV Trip Import
This section outlines the mandatory requirements, duplicate detection logic, and how the system behaves during trip imports.
Required Fields for CSV Upload
The following fields must be present in every CSV record.
| Field | Required | Description | Example |
|---|---|---|---|
| Passenger Name | Yes | Full name or first + last name of the passenger | John Doe |
| Primary Phone Number | Yes | Passenger’s main contact number | 3155558899 |
| Pickup Address | Yes | Pickup location (full or broken down) | 116 MLK E, Syracuse, NY |
| Dropoff Address | Yes | Dropoff location (full or broken down) | 500 State St, Syracuse, NY |
Important:
If any required field is missing, that record will fail and appear in the error log.
System Rules for CSV Trip Import
This section outlines the mandatory requirements, duplicate detection logic, and how the system behaves during trip imports.
Required Fields for CSV Upload
The following fields must be present in every CSV record.
| Field | Required | Description | Example |
|---|---|---|---|
| Passenger Name | Yes | Full name or first + last name of the passenger | John Doe |
| Primary Phone Number | Yes | Passenger’s main contact number | 3155558899 |
| Pickup Address | Yes | Pickup location (full or broken down) | 116 MLK E, Syracuse, NY |
| Dropoff Address | Yes | Dropoff location (full or broken down) | 500 State St, Syracuse, NY |
Important:
If any required field is missing, that record will fail and appear in the error log.
Will Call Behavior
Rule
If both pickup time and dropoff time are not mapped, the system automatically creates the trip in Will Call status.
Example — Will Call Creation
| Passenger | Pickup Time | Dropoff Time | Result |
|---|---|---|---|
| John Doe | (blank) | (blank) | Trip created as Will Call |
| Maria Lopez | 08:30 | (blank) | Scheduled trip |
| Sam Lee | (blank) | 10:00 | Scheduled trip |
Key Point:
Will Call is triggered only when both times are missing.
Passenger Duplicate Detection
The system prevents duplicate passenger profiles using the following hierarchy.
Matching Criteria
- Passenger Name
- Phone Number
- MRN (if present)
Duplicate Logic
| Scenario | Result |
|---|---|
| Name + Phone + MRN match | Existing passenger reused |
| Any of the above differ | New passenger profile created |
| MRN not provided | System uses Name + Phone only |
Example — Existing Profile Used
Existing in the system
| Name | Phone | MRN |
|---|---|---|
| John Doe | 1234567890 | 1234 |
CSV record
| Name | Phone | MRN |
|---|---|---|
| John Doe | 1234567890 | 1234 |
Result: Existing profile used (no duplicate created)
Example — Duplicate Profile Created
Existing
| Name | Phone | MRN |
|---|---|---|
| John Doe | 1234567890 | 1234 |
CSV
| Name | Phone | MRN |
|---|---|---|
| John Doe | 1234567890 | 4567 |
Result: New passenger profile created
Example — MRN Missing
If MRN is not present:
Existing
| Name | Phone |
|---|---|
| John Doe | 1234567890 |
CSV
| Name | Phone |
|---|---|
| John Doe | 1234567890 |
Result: Existing profile reused
Trip Duplicate Detection
Currently, trip duplication is evaluated using:
- Passenger Name
- Pickup Address
- Dropoff Address
(Date and time are not part of duplicate logic today.)
Duplicate Behavior
When multiple records (same service date) have identical:
- Passenger
- Pickup address
- Dropoff address
The system behaves as follows.
| Step | System Action |
|---|---|
| First occurrence | Trip is created |
| Subsequent duplicates | First trip is updated |
| Logging | Update recorded in CSV error log |
Example — Duplicate Trip Update
CSV Input
| Passenger | Pickup | Dropoff |
|---|---|---|
| John Doe | A | B |
| John Doe | A | B |
Result
- Only one trip exists
- The second row updates the first with information in second trip
- Error log notes the update
When Trips Are Created Separately
If either pickup or dropoff address differs, the system creates separate trips.
Example — Separate Trips
CSV Input
| Passenger | Pickup | Dropoff |
|---|---|---|
| John Doe | A | B |
| John Doe | B | C |
Result
System creates:
- Leg-A
- Leg-B
Sequential Leg Creation
When multiple distinct records exist for the same passenger, the system automatically sequences legs.
Example — Three Legs
CSV
| Passenger | Pickup | Dropoff |
|---|---|---|
| John Doe | A | B |
| John Doe | B | C |
| John Doe | C | D |
Result
| Generated Trip | Leg |
|---|---|
| Trip 1 | Leg-A |
| Trip 2 | Leg-B |
| Trip 3 | Leg-C |
Interaction with Standing Orders
If a passenger already has a standing order:
- CSV trips get their own leg sequence
- They do not merge with standing order legs
Example
Standing Order (existing)
- Leg-A
- Leg-B
CSV upload adds two new trips
Result
CSV creates:
- Leg-A
- Leg-B
(separate from standing order sequence)
Important Edge Case — Return Trip Uploads
This section explains how the system behaves when outbound and return trips are uploaded separately and how to correctly generate return legs when your source file only contains outbound trips.
Scenario 1 — Single Outbound Trip in CSV
Behavior
When the CSV contains only one outbound trip (Leg-A) for a passenger, the system can correctly attach the return trip (Leg-B) when it is uploaded later.
Example
First Upload (Outbound Only)
| Passenger | Pickup Address | Dropoff Address |
|---|---|---|
| John Doe | 116 Martin Luther King E, Syracuse, NY 13205 | 500 State St, Syracuse, NY 13202 |
System Result
| Created Trip | Leg |
|---|---|
| Trip 1 | Leg-A |
Second Upload (Return)
| Passenger | Pickup Address | Dropoff Address |
|---|---|---|
| John Doe | 500 State St, Syracuse, NY 13202 | 116 Martin Luther King E, Syracuse, NY 13205 |
System Result
| Created Trip | Leg |
|---|---|
| Trip 2 | Leg-B |
Outcome:
The system correctly pairs the return with the outbound trip.
Scenario 2 — Multiple Outbound Records in CSV
Behavior
When the CSV contains multiple records for the same passenger, the system assumes they are sequential legs of one continuous journey.
Because of this, later uploads cannot retroactively pair returns.
Example
First Upload (3 Records)
| Passenger | Pickup Address | Dropoff Address |
|---|---|---|
| John Doe | 116 Martin Luther King E, Syracuse, NY 13205 | 500 State St, Syracuse, NY 13202 |
| John Doe | 500 State St, Syracuse, NY 13202 | 725 Irving Ave, Syracuse, NY 13210 |
| John Doe | 725 Irving Ave, Syracuse, NY 13210 | 116 Martin Luther King E, Syracuse, NY 13205 |
System Result
| Created Trip | Leg |
|---|---|
| Trip 1 | Leg-A |
| Trip 2 | Leg-B |
| Trip 3 | Leg-C |
Second Upload (Returns)
| Passenger | Pickup Address | Dropoff Address |
|---|---|---|
| John Doe | 500 State St, Syracuse, NY 13202 | 116 Martin Luther King E, Syracuse, NY 13205 |
| John Doe | 725 Irving Ave, Syracuse, NY 13210 | 116 Martin Luther King E, Syracuse, NY 13205 |
| John Doe | 800 University Ave, Syracuse, NY 13244 | 116 Martin Luther King E, Syracuse, NY 13205 |
System Result
| Created Trip | Leg |
|---|---|
| Trip 4 | Leg-D |
| Trip 5 | Leg-E |
| Trip 6 | Leg-F |
Why does this happen?
The system:
- Processes trips in the order received
- Always assigns the next available leg
- Does not retroactively pair earlier legs
- Treats multiple rows as a continuous chain
In Scenario 2, the first upload already consumed:
- Leg-A
- Leg-B
- Leg-C
So the next upload continues with:
- Leg-D
- Leg-E
- Leg-F
Source of Truth — Trip-Level Data from CSV
When importing trips via CSV, the system treats the CSV file as the source of truth for trip-level information.
This ensures that operational trip details always reflect the most recent data provided by the customer’s integration (CIM), even if the passenger profile already exists in Tobi.
Rule
If a passenger profile already exists in the system and the incoming CSV contains different values for trip-level fields, the system will:
- Use the values from the CSV for the trip
- Not override the existing passenger profile
- Apply the CSV values at the trip level
Fields Affected
This applies to trip-level and mapped fields such as:
- Seating Needs
- Primary Phone Number (on trip)
- Secondary Phone Number (on trip)
- Trip Purpose
- Mode
- Tags
- Authorization Number
- Service Type
- Booking Notes
(and any other trip-mapped fields)
How the System Behaves?
| Scenario | Passenger Profile | CSV Value | Result on Trip |
|---|---|---|---|
| Values match | Wheelchair | Wheelchair | Wheelchair |
| Values differ | Wheelchair | Ambulatory | Ambulatory (CSV wins) |
| Profile missing field | (blank) | Wheelchair | Wheelchair applied |
| Profile has value | 3155551111 | 3155552222 | 3155552222 used on trip |
Example — Seating Need Override
Existing Passenger Profile
| Field | Value |
|---|---|
| Passenger | John Doe |
| Seating Need | Wheelchair |
CSV Record
| Passenger | Seating Need |
|---|---|
| John Doe | Ambulatory |
Result
- Passenger profile remains Wheelchair
- Imported trip shows Ambulatory
- CSV is treated as the source of truth for the trip
Example — Phone Number Difference
Existing Profile
| Field | Value |
|---|---|
| Passenger | Maria Lopez |
| Primary Phone | 315-555-1111 |
CSV Record
| Passenger | Primary Phone |
|---|---|
| Maria Lopez | 315-555-9999 |
Result
- Passenger profile remains 315-555-1111
- Trip uses 315-555-9999
Need Help?
For assistance with CSV imports, contact: