Bulk import data, export reports, and create backups
Bulk data import
Import assets, parts, locations, users, vendors, customers, WOs, PM plans, and requests via CSV.
Vendors support individual contacts directly in import and export. Add numbered columns — Contact 1 Name, Contact 1 Email, Contact 1 Phone, Contact 1 Role, Contact 1 Primary — and repeat with Contact 2, Contact 3, and so on for as many contacts as you need. Only the name is required; the email can be left blank. Exporting your vendors already includes these columns, so you can export, edit, and re-upload. When updating, including any Contact column replaces that vendor's contacts; leave the Contact columns out to keep the existing ones.
Your custom fields appear as cf_ columns in the export and can be filled in and re-imported. Leave a cf_ column out of your file to keep the stored value untouched; include it and leave the cell empty to clear it.
Locations can be nested as deeply as you need. In the Parent Location column, type the parent's name — or, when sub-locations share the same name in different branches, the full path with each level separated by ' > ' (for example: Site A > Building 1 > Floor 2). This lets you reuse a name like 'Office' or 'Corridor' under different parents without any conflict. Exports already fill this column with the full path, so an exported file re-imports exactly as it was.
Up to 8,000 rows per file. This limits ONE FILE, not your account: there is no cap on how many assets, parts, locations or any other records you can hold — on any plan, including the free Core plan. A larger dataset is simply split into several files that you import one after another, and each import adds to what is already there. Very large files also take longer and produce a longer error report, so 2,000 to 5,000 rows per file is usually more comfortable to work with than one file at the maximum.
A person is matched on ID, then email, then username — so re-importing a roster export never creates a second account for someone you already have. In Create new only, those rows are skipped and listed by name. In the two update modes, only the first and last name are changed from a file: role, email, username and password are never modified by an import. Two different people with the same name stay two people — a name is not an identity.
A column you DELETE from the file, or a cell you leave EMPTY, keeps its stored value. That is how you update one thing without disturbing another: to fill in unit costs across hundreds of parts without touching stock levels, delete the Quantity column before uploading. Total value is recalculated from the new unit cost automatically.
To clear a stored value instead, type NONE in the cell (upper or lower case). This works for assets in Model, Manufacturer, Description, Area / Zone and Barcode, and for parts in Description, Part Number, Manufacturer and Storage Location; NONE in Location (Name) detaches the part from its location. NONE only clears on a row that updates an existing record — on a row that creates a new one it is ignored and the field stays empty. A dash (-) is not read as NONE: it is saved as typed.
The exported file and the import template now use the same columns, so you can export your data, edit it in Excel and upload it straight back — no need to add or rename columns. Keep the ID column untouched: it is what matches each row to the existing record, so rows are updated instead of duplicated. Columns that cannot be imported (On Hand, On Order, Total Cost, dates) are listed as ignored during the mapping step.
To remove a parent during an Excel import, type NONE in the Parent Asset (or Parent Location) column. A blank cell means "leave unchanged", so clearing it will not detach the parent.
Always start with the template.
Export your data, make your edits, then re-upload the file. FreeMaint matches each row back to its existing record by the ID (or Reference) column, so records are updated in place instead of duplicated. On the preview step you choose how the import is applied:
Download and use templates
Templates contain exact headers and format expected.
Columns that reference another record — Asset, Location, Parent asset, Vendor, Team, Category — normally match by name. When two records share a name, type the reference instead (for example ASS-12 or LOC-4) or #id (for example #123): both are in every export, so an export you edit and re-upload always lands on the right record. If a name does match several records the import still runs and warns you which cell to make explicit.
Excel: Save As > CSV UTF-8 format.
Export your data
Export from any module for analysis or backup.
Regular exports as additional backup.
Company data backup
Export a copy of your whole company. Two purposes, two formats: the Excel workbook moves your data into another FreeMaint account, while JSON, ZIP and SQL are archives for record-keeping and compliance outside the app.
Important:
Want only your own personal data instead of the whole company? Settings → Download My Data.
Export 100% of your data on every plan — formats, GDPR compliance and migration tips
Your data belongs to you. FreeMaint commits to full data portability: every entity you create can be exported in machine-readable formats, on every tier, with no rate limit, no per-record fee, and no special API key. The point is that your CMMS choice should be reversible — if FreeMaint stops working for you, you can leave with everything intact.
To carry your data from one FreeMaint account into another, export the Excel workbook from Company Settings → Data → Export Archive, then import each of its sheets from its own list page. The workbook has one sheet per record type and its columns already match the import templates, so nothing needs editing. Its README sheet lists the order to follow. The JSON, ZIP and SQL exports cannot do this — they are archives, and nothing in FreeMaint reads them back.
Every list view (work orders, assets, parts, locations, users, vendors, customers, PM plans, requests, purchase orders, fuel logs) carries an Export button in its toolbar. The export honours the filters and date range currently applied — so you can scope an export to a single location, a single team, or a date window.
Article 20 of GDPR grants every data subject the right to receive their personal data in a structured, machine-readable format. FreeMaint serves this two ways: the company-level export described above, and an individual one — any user can download their own data from Settings → Download My Data, which returns a JSON bundle of their profile, the work orders and requests they created, their comments, their consents and their activity history. It needs no permission and no paid plan. Erasure (Article 17) is handled by Settings → Delete account.
Important:
Each tenant is fully isolated at the database row level via companyId scoping. There is no shared dataset across customers; an admin from company A cannot see company B's data through any API surface.
If you are coming from UpKeep, MaintainX, Fiix, or any other CMMS, the typical path is: export each entity type from the source as CSV, map the columns to the FreeMaint bulk-import template, then upload. The match-by-reference feature lets you preserve external identifiers, so your existing asset tags and PM plan codes survive the migration.
You own your data. FreeMaint is a processor; you are the controller. The terms of service spell out that we never sell, repackage, or use your tenant data to train models. Aggregate anonymous metrics (count of work orders shipped, asset count) are computed for product analytics but never tied back to a specific tenant.
Exports use the same column layout as the bulk-import templates. That means you can export a list, edit it in Excel, and re-import — for example to mass-update categories, assignees, or locations. Match-by-reference resolves rows back to their internal IDs without dangling.
Set a calendar reminder for monthly exports. Which format matters: the Excel workbook is the one you can import back, so take that if you want a copy you could restore from. JSON and ZIP are for keeping the full record — including the entity types the importer does not cover.
Fix common problems
Solutions to common import issues.
Issue: Invalid format
Solution: Use template, save as CSV UTF-8
Issue: Rows skipped
Solution: Check error report: duplicates, missing required fields, invalid references
Issue: Corrupted characters
Solution: UTF-8 encoding. Excel: Save As > CSV UTF-8
Issue: Timeout
Solution: Split the file into smaller batches — 2,000 to 5,000 rows imports comfortably. The maximum is 8,000 rows per file.
Issue: A column I filled in is missing from the imported records
Solution: Only columns mapped to a field are imported — the rest are listed in the warning shown at the mapping step and again on the result screen. Assignment needs the 'Assigned To (Email)' column (also accepted: Assignee, Assigned To, Technician); a custom field cannot assign anyone.
Issue: Invalid format
Solution: Use template, save as CSV UTF-8
Issue: Rows skipped
Solution: Check error report: duplicates, missing required fields, invalid references
Issue: Corrupted characters
Solution: UTF-8 encoding. Excel: Save As > CSV UTF-8
Issue: Timeout
Solution: Split the file into smaller batches — 2,000 to 5,000 rows imports comfortably. The maximum is 8,000 rows per file.
Issue: A column I filled in is missing from the imported records
Solution: Only columns mapped to a field are imported — the rest are listed in the warning shown at the mapping step and again on the result screen. Assignment needs the 'Assigned To (Email)' column (also accepted: Assignee, Assigned To, Technician); a custom field cannot assign anyone.
Preview before confirming — FreeMaint validates all rows first.
FreeMaint CMMS
© 2026 FreeMaint. All rights reserved.