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.
Before an asset import, the preview tells you which rows share a barcode with another row of the file and which rows carry a barcode another asset already has. Creating those rows would give two assets the same code; updating the asset that carries the code does not. If your company turned on “Unique asset barcodes”, those rows are refused and listed with the reason, and the rest of the file is imported.
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. Exception: a parts file whose rows give both a quantity and a location, imported in "Update existing only" or "Update existing & create the rest" mode, updates stock location by location and is limited to 2,500 rows per file, because each of those rows takes longer to write.
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, and NONE in Customer (Name) detaches the asset from its customer. 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, Customer — 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.
The work order export adds the parts, labor, other and total cost of each work order, and the asset report (Excel and PDF) adds the cost of each job with a maintenance cost summary. They appear only for people allowed to see work order costs; labor needs its own permission.
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.
A full archive of your data on every plan — formats, GDPR compliance and migration tips
Your data belongs to you. FreeMaint commits to full data portability: on every plan, Core included, you can download a complete archive of your company's data in machine-readable formats (JSON, ZIP, SQL or an Excel workbook), with no per-record fee and no 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.
There are two ways out. The complete archive — Company Settings → Data → Export Archive — is free on every plan. On Starter and above, the list pages (work orders, assets, parts, locations, users, vendors, customers, PM plans, requests, tools, projects, inspections and more) also carry an Export button that writes the list to CSV or Excel. That export follows the filters currently applied — so you can scope it 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 company is fully isolated at the database row level: every record belongs to one company and every query is filtered on it. There is no shared dataset across customers; an admin from company A cannot see company B's data through any screen or API.
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 processes it on your behalf: you are the controller, FreeMaint is the processor. We never sell or share your data, and no AI model is trained on it. To improve the product we measure which features are used — action names, linked to your company, never their content: no work order text, no documents, no photos. The Privacy Policy lists what is collected and how to refuse it.
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. Dates and times are in your company's time zone, named in the last column (timezone); the import ignores that column.
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. Exception: a parts file whose rows give both a quantity and a location, imported in "Update existing only" or "Update existing & create the rest" mode, updates stock location by location and is limited to 2,500 rows per file, because each of those rows takes longer to write.
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. Exception: a parts file whose rows give both a quantity and a location, imported in "Update existing only" or "Update existing & create the rest" mode, updates stock location by location and is limited to 2,500 rows per file, because each of those rows takes longer to write.
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.