CSV import
The fastest way to get existing asset data into Tether. Upload a spreadsheet and Tether creates or updates assets in bulk, auto-creating categories and locations that don't yet exist.
Before you import
- Make sure you are logged into the correct client portal. Import is tenant-scoped — assets will be created in whichever tenant you are currently in.
- Export your existing data from wherever it lives (another tool, a spreadsheet, Snipe-IT) and clean it up in Excel or Google Sheets before importing.
- Your file must be saved as
.csv(not.xlsxor.ods). - In SaaS mode, if the import would push you over your plan limit, the entire import is rejected with a
402error. Reduce the file to fit within your remaining capacity or upgrade first.
Upload 5–10 rows first to confirm the column mapping works correctly before importing your full dataset.
Column reference
The first row of your CSV must be a header row. Column names are case-insensitive. Only asset_tag is required — all others are optional and can be omitted entirely.
| Column name | Required | Format / accepted values | Notes |
|---|---|---|---|
asset_tag | Yes | Any string, unique per tenant | Primary key. If a record with this tag already exists, it is updated. If it does not exist, it is created. |
name | No | Any string | Defaults to the asset tag if omitted |
manufacturer | No | Any string | e.g. Apple, Dell, Lenovo |
model | No | Any string | e.g. MacBook Pro 16, Latitude 7440 |
serial | No | Any string | Manufacturer serial number |
category | No | Any string | If the category doesn't exist in this tenant, it is created automatically |
location | No | Any string | If the location doesn't exist in this tenant, it is created automatically |
status | No | available, deployed, maintenance, retired | Defaults to available if blank or omitted |
assigned_to | No | Person's name or email | If the person doesn't exist as an employee in this tenant, they are created. If status is blank and this field is set, status defaults to deployed. |
purchase_date | No | YYYY-MM-DD, MM/DD/YYYY, or DD/MM/YYYY | Date the asset was purchased |
purchase_cost | No | Numeric (strips $, commas, spaces) | e.g. $1,499.00 or 1499 — both work |
warranty_expiry | No | Same date formats as purchase_date | Assets within 30 days of expiry appear on the dashboard |
notes | No | Any string | Free-form notes |
Example CSV
csvasset_tag,name,manufacturer,model,category,location,status,assigned_to,purchase_cost,warranty_expiry IT-0001,MacBook Pro 16,Apple,M3 Max,Laptop,Head Office,deployed,Sarah Chen,3499,2027-03-01 IT-0002,Dell Latitude 7440,Dell,7440,Laptop,Remote,deployed,Marcus Webb,1450,2027-06-12 IT-0003,UltraSharp 27,Dell,U2724DE,Monitor,Head Office,available,,620,2027-01-20 IT-0004,iPhone 15 Pro,Apple,A2848,Phone,Remote,deployed,Sarah Chen,1099,2026-02-15 IT-0005,PowerEdge R760,Dell,R760,Server,Warehouse,available,,8200,2028-09-01
Create vs update behaviour
Import uses an upsert pattern based on the asset_tag column:
- If no asset with that tag exists in the tenant → a new asset is created
- If an asset with that tag already exists → its fields are updated with the CSV values
The import response tells you exactly how many were created vs updated:
json{{ "created": 3, "updated": 2, "errors": [] }}
Importing a CSV only creates or updates records — it never deletes assets that aren't in the file. If you need to remove assets, delete them manually or via the API.
Error handling
Tether validates each row individually. If a row has an error (e.g. an invalid status value
or an unrecognisable date format), that row is skipped and added to the errors
list in the response. Valid rows in the same file are still imported.
json{{ "created": 8, "updated": 1, "errors": [ {{"row": 4, "error": "Invalid status 'in use'. Must be: available, deployed, maintenance, retired"}}, {{"row": 7, "error": "purchase_cost must be numeric, got 'TBD'"}} ] }}
Fix the errored rows and re-import just those rows, or correct them manually after the initial import.
How to import
Navigate to the correct client
Make sure you are on the client's subdomain (or switch to them as MSP staff). All imported assets go into the current tenant.
Open the import screen
Go to Assets → Import in the sidebar.
Upload your CSV
Click Choose File, select your CSV, then click Import. Files up to 50 MB are accepted (configurable in nginx with client_max_body_size).
Review the results
The result summary shows how many assets were created, updated, and any rows with errors. Fix errors and re-import if needed.
A CSV with 1,000+ rows can take 5–15 seconds to process. Do not close the browser tab while the import is running. The request will time out after 60 seconds — for very large datasets, split into batches of ~500 rows.