Import locations
Add or update all your schools, buildings and their rooms at once from one CSV. The template, every field, how rows are matched to the locations and rooms you have, and what to do when a row is skipped or rejected.
Open the Locations & Rooms tab of Admin › Account › Import Data to bring in your schools and buildings, and the rooms in them, from one spreadsheet. Do this before you import people or assets, so their location and room names have something to match.
Each row names a Location and, if you like, a Room in it:
- Room blank: the row adds the location, or updates it if you already have it.
- Room filled in: the row adds or updates the location, and adds or updates the room inside it.
- Location blank: the row is skipped, and the preview lists it under Skipped Rows with the reason No location. Nothing is dropped without saying so.
Reloading one building's rooms? Pick that building as the Location at the top, and every row goes into it (see One building's rooms).
The line under the tabs says how many you have, for example 9 locations and 14 rooms in schoolOS., and View all locations opens Admin › Locations › Locations.
The import never deletes anything. Locations and rooms that aren't in your file stay as they are.
Import a CSV#
- Select Download Template at the top right. You get
locations-rooms-import-template.csv, with one column per field. Or use your own export: columns are matched by name in the next step. - Leave Location at the top on Each row names its location, or pick one of your locations for the whole file (see One building's rooms).
- Drop your CSV on the page, or click to browse. Only
.csvfiles work, one at a time. The page shows the file's name, size and number of rows. A file can have up to 5,000 rows. Choose a different file starts over. - Select Continue to Field Mapping.
- Under Map your columns, check the field next to each column in your file. Columns whose names match a field are matched for you (see Fields), and the rest are skipped. Change any match that's wrong.
- Select Validate Data. Nothing is saved yet: you get a preview of what each row would do.
- Review the counts, skipped rows and any row errors (see Review the results).
- Select Import Locations & Rooms. If some rows were skipped or had errors, the button reads Import N Valid Rows instead, and only those rows are saved.

New locations go into your account's first active district. If your role only reaches one district or school, they go into your own district.
Fields#
Available Fields, at the bottom of the upload step, lists every field with its column name. Only Location is required as a column; a row that leaves it blank is skipped. With a location picked at the top, there's no Location column at all.
The location's own fields:
| Field | Column | What to put in it |
| --- | --- | --- |
| Location (required) | location | The building or school: its name, or an abbreviation or code it already has. A file made for the old Locations import, with a name column, still works: that column is read as Location. |
| Code | code | A short unique code. Leave it empty and a new location gets one made from its abbreviation, or its name. |
| Abbreviation | abbreviation | A short name, like NHS. Other rows can name the location by it. |
| Location Type | location_type | Free text, like School, District Office or Warehouse. |
| Street Address | street1 | The street address. |
| Street Address 2 | street2 | Suite, building or floor. |
| City | city | |
| State | state | State or province. |
| ZIP Code | zip | |
| Country | country | A name or a code. |
| Latitude | latitude | A number, like 37.7749. |
| Longitude | longitude | A number, like -122.4194. |
| Status | status | active, inactive, suspended or archived, in any capitalization. A new location with it empty is active. |
The room's fields. Leave them all blank on a row that is just the location:
| Field | Column | What to put in it |
| --- | --- | --- |
| Room | room_name | What the room is called: "204", "Library", "101 Conference". A room that is only a number can leave this blank and fill in Room Number. |
| Room Number | room_number | Matches an existing room first. Read off the name when the name starts with a number. |
| Room Code | room_code | Optional; made from the room's name when blank. Unique within the location. |
| Room Type | room_type | Like Classroom, Lab or Office. |
| Capacity | capacity | A whole number, like 30. 12.5 is rejected. |
| Room Status | room_status | active, inactive, suspended or archived. A new room is active; blank keeps an existing room's status. |
A column is matched to a field when its name matches the field's name or column name, ignoring capitalization, spaces, hyphens and underscores. Room, Room Number and room-type all match their fields. abbr and short name match Abbreviation.
The location's fields repeat on each of its room rows, so you can fill them in on every row, on one row, or not at all. Rows for the same location that fill in a field must agree on it: if one says City "Fresno" and another "Clovis", both rows are errors (see How rows are matched). Capitalization and extra spaces don't count as a difference.
Codes are capital letters and digits, with anything else turned into hyphens. "North High School" with no abbreviation becomes NORTH-HIGH-SCHOOL. With the abbreviation "NHS", it becomes NHS.
Which should I choose?#
One row per room, or a location row and then room rows?
- One row per room, with the location's address on every row, is what most exports give you. It works as long as the rows agree.
- A location row, then room rows that name only the location (by its name or abbreviation) keeps the address in one place, so there's nothing to disagree. Choose this when you build the sheet by hand.
Code: fill it in or leave it empty?
- Fill it in with the codes your district already uses, like your state school numbers or SIS building codes. Each location then carries the same identifier as your other systems, the Locations search finds it by that code, and rows can name the location by it.
- Leave it empty when you have no codes of your own. A new location gets one made from its abbreviation, or its name. An existing location keeps the code it has.
Status: leave it empty or set it?
- Leave it empty for every place that's open today. A new location is
active, and an existing one keeps its status. inactive,suspendedorarchivedonly to keep a record of a closed building. It can't be the default location, and it isn't offered under Move them to when you delete another location. The form can't make it active again.
For example, a district with 12 schools fills in a sheet with one row per school (its state school number in Code, its address and abbreviation) and then a row per classroom that names the school by its abbreviation, like LHS and 204. One import adds the 12 schools and all their rooms.
How rows are matched#
Locations. A row finds its location by its Location, Abbreviation or Code, compared with the name, abbreviation and code of every location in your account, ignoring capitalization, spaces and punctuation. "NHS", "nhs" and "N.H.S." all find Northside High School when its abbreviation is NHS.
- No match: the location is created, named by the row's Location.
- One match: the location is updated. Filled-in cells replace what it has; blank cells keep it. The location's name is never changed by an import: rename it on Admin › Locations › Locations.
- More than one match: the row is an error, with the locations it matched. Use a full name or code that only one location has.
Rows in your file that share a name, abbreviation or code are the same location, whichever order they come in. A row "Northside High" with abbreviation "NHS" and a row that only says "NHS" make one location, not two. If two such rows give the location different names, or different values for any field, the rows that disagree are errors, and the location's other rows wait until they're fixed. Nothing is chosen for you.
Rooms. Within its location, a row matches an existing room by Room Number first, then by Room, then by Room Code, with spacing and punctuation ignored, so "A WR1" and "A-WR1" are one room. A match updates the room, and blank cells keep what it has. No match creates the room. A file that lists the same room twice at one location is an error on the repeat, so the second copy never overwrites the first.
Your default location can be matched, so rooms can be added to it, but an import never changes its name or its type and never makes it inactive. A row that tries is an error: leave Location Type and Status blank on its rows.
Permissions. Each row is checked:
- Adding a location needs Add locations (
locations.create). - Changing a location, or adding or changing its rooms, needs Edit locations (
locations.update). - A row for a location your role doesn't reach is an error.
Running the same file twice changes nothing the second time: every location and room is found and set to the same values. So you can fix a sheet and import all of it again.
Review the results#
Validation Review shows:
- Rows, Locations to add, Locations to update, Rooms to add, Rooms to update, Skipped and Rows with errors.
- Configuration Issues, for problems with the file as a whole, like a column that names your account.
- Row Errors. Each rejected row with its row number in your file (row 1 is the header), the place it names ("Lincoln High School › 204") and the reasons.
- Skipped Rows. Each row with no location, its room, and the reason No location.
- Rows Ready to Import. Each row that passed, with what it does: for example Create location · Create room, or Update location.

Fix rejected rows in your file and import it again, or import the valid rows now and the rest later. The whole file is always read together, so the row numbers on every step match your file.
Back to Mapping changes the mapping. Start Another Import starts over with a new file.
After the import#
The last step shows Import Successful or Import Finished With Errors, how many locations and rooms were added and updated, what was skipped, and the reason for each row that failed. Select View Locations to see them on Admin › Locations › Locations, or Start Another Import.
Recent imports under the tab lists the last few files: when, who, and how many rows came in or failed. Note the reasons for any failures before you leave the page; they're shown only here.
What's next#
- Choose your default location, where people and assets without a location go.
- Import your people.
One building's rooms#
Rooms come in on the same tab as their locations: there's one upload for both. To add or reload one building's rooms, pick that building as the Location at the top, above the drop zone. Leave it on Each row names its location for a file that covers several buildings.
With a location picked:
- Every row goes into it. The file needs no Location column, and if it has one, it's ignored.
- A row with no location isn't skipped, since the picked location is every row's.
- The location is never created. You pick from the locations you already have and can reach. Add a new building with a row that names it, or on Admin › Locations › Locations.
- Its rooms are matched as described in How rows are matched: a match updates the room with blank cells keeping what it has, no match creates it, and a room listed twice is an error on the repeat. Two rooms that share a number, like "101 Conference" and "101 Reception", need their names in the file, since the number alone would match both.
- Location columns still apply to it. If the file fills in the location's own fields, like City, they update the picked location, and rows that disagree are errors, as on any other file.
Adding or changing rooms needs Edit locations (locations.update), the same as adding a room by hand. A file can have up to 5,000 rows; split a larger one and import each part.
Which should I choose?#
- Pick a location when the file is one building's rooms, like a room list from its principal. Nothing in the file can send a room to the wrong building, or make a new one.
- Each row names its location when the file covers several buildings, or adds buildings too.
You don't need to import rooms a device file names: the assets import creates a room its row names in the row's location when that location doesn't have it yet.
Was this article helpful?
Related articles
- Import your dataOne page to bring your locations, people, assets, tickets and help articles into schoolOS, with how many of each you have. What to import first, file or connection, and whether to bring it in once or keep it in sync.
- LocationsAdd, edit and delete your schools and buildings, manage their rooms, and choose the default location where people and assets land when they arrive without one.
- Import peopleAdd or update staff and students from a CSV, a nightly SFTP file, or your SIS over OneRoster. How matching, roles and locations work.
- Get started with schoolOSThe setup steps for a new account, in order. Which ones are required, which can wait, and what changes with each one.
Updated October 28, 2026
