Import, Export & Labels
Three bulk tools live on the Asset Registry toolbar: Import Assets brings whole inventories in from a CSV/XLSX (including a raw Snipe-IT export), Export Assets streams a filtered XLSX that round-trips back through the importer, and Print asset labels produces QR + barcode label PDFs ready for a label printer.
Toolbar button "Import Assets" (cloud-upload icon). Upload a CSV or
XLSX, dedupe on Asset Tag, auto-create missing catalog masters. Needs the
asset_import permission.
Toolbar button "Export Assets" (cloud-download icon). Filtered XLSX
with a column picker — including every custom field. Needs the
asset_export permission.
Toolbar button "Print asset labels" (QR-code icon). Select assets by
Category/Location and print QR + Code-128 label PDFs. Also gated by
asset_export.
ams/assets and only appear
when you hold the matching permission (see Permissions & Roles).
Note that "Export Assets" and "Print asset labels" share the same
asset_export permission — granting one grants both.
Import Assets (CSV / XLSX)
The importer is Snipe-IT-compatible: it understands the header names Snipe-IT uses in its asset exports, matched case-insensitively, so a raw Snipe-IT CSV imports without any editing. It works just as well with the module's own template or your own spreadsheet, as long as the headers match one of the accepted aliases below.
The import flow, step by step
-
Open the modal
On the registry's Browse tab, click "Import Assets". The modal shows a single-file uploader, an "Update existing assets" checkbox, and a help block headed "Import from Snipe-IT CSV".
-
Download the template (optional)
The "Export Excel" button on the modal footer (bottom-left) downloads
assets-import-template.xlsx— a one-row workbook containing the 19 canonical headers in bold. Fill it in and you are guaranteed a clean import; the same headers are what the Export Assets tool writes, so exports round-trip. -
Upload the file
Drop or pick your file. Only
.csv,.xlsx, and.xlsare accepted — anything else is rejected with "Please upload an excel file. (.csv / .xlsx)". Decide whether to tick "Update existing assets" (see dedupe semantics below). -
Click "Next", then "Upload"
The file type is checked during upload — only
.csv/.xlsx/.xlspass. The "Next" button enables once the file finishes uploading; clicking it stages the file and reveals the "Upload" button, which runs the import. -
Read the summary
On success the registry table reloads and a summary appears both as a toast and inside the modal: "Import complete: %d created, %d updated, %d skipped."
Supported columns & accepted header aliases
Headers are matched after trimming, case-folding, and stripping a UTF-8 BOM. Each row lists the canonical header (as written by the template and the exporter) and every alias the importer accepts. Columns not in this table are either treated as custom fields or skipped silently.
| Canonical header | Accepted aliases | Fills / behavior |
|---|---|---|
| Asset Tag | asset_tag, Tag | The dedupe key. Blank on a new row → tag auto-generated as AST- + zero-padded id (e.g. AST-000123). |
| Name | Item Name, Asset Name | The asset's Title. |
| Category | — | Matched by name (case-insensitive); created if missing. Drives which custom fields apply. |
| Model Name | Model | Asset Model catalog entry, matched by name + model number; created if missing. |
| Model Number | Model No., Model No | Part of the Asset Model match. |
| Manufacturer | Make | Matched/created as a Brand (flagged for assets). |
| Serial Number | Serial, Serial No | Serial no. field. |
| Status | Status Label | Matched by name; created if missing as a deployable, teal (#1d97a6) status label. See Status Labels. |
| Warranty | Warranty Months, Warranty (Months), Warranty Expires | Accepts an integer month count or a date (months derived from the purchase date). |
| Purchase Date | Purchased | Parsed flexibly (strtotime). |
| Purchase Cost | Cost | Currency symbols and thousands separators are stripped (₱, commas, etc.). |
| Order Number | — | Order Number field. |
| Supplier | Vendor | Matched/created as a Vendor. |
| Location | — | Matched by name; created if missing. See Locations. |
| Notes | — | The asset Description (also pinned as the asset's first comment). |
| Image | — | Only the file's basename is kept. |
| Requestable | — | Accepts 1 / yes / y / true / t / x. Stored, but note: there is no request-an-asset workflow in the UI yet. |
| Checked Out To | Full Name | Checkout-on-import columns — see below. Also accepted: Checkout Type (alias Type), Username, First Name, Last Name. |
| — |
Dedupe on Asset Tag & the "Update existing assets" toggle
Asset Tag is the sole dedupe key — an exact (case-sensitive) match against non-deleted assets. What happens to each row depends on whether the tag already exists and whether the checkbox is ticked:
| Incoming row | "Update existing assets" | Outcome |
|---|---|---|
| Tag not found (or blank) | Either | Created New asset; a blank tag gets an auto-generated AST-000123-style tag. |
| Tag already exists | Off (default) | Skipped Row is skipped (reason already_exists) and counted in the summary's "skipped" figure. |
| Tag already exists | On | Updated Matching asset is refreshed — but blank incoming cells never overwrite existing values, so a sparse spreadsheet can safely update just the columns it contains. |
Masters created automatically
The importer never fails a row because a lookup value doesn't exist yet. Each of the following is matched by case-insensitive exact name and created on the fly when missing:
- Category — see Categories.
- Location — see Locations.
- Manufacturer → created as a Brand flagged for the Assets module.
- Supplier → created as a Vendor.
- Status Label → created as deployable, teal
#1d97a6— review new labels afterwards on Status Labels if the imported names imply a different deploy type (e.g. a "Retired" label should probably be Archived, not Deployable). - Asset Model → matched by name + model number; if the model itself needs a category and none resolves, an "Unnamed Category" is created for it. See Asset Models.
Custom fields on import
Any column the importer doesn't recognize is checked against the resolved category's custom-field schema: if the header matches a field key or label, the value is written into the asset's "Additional fields" (meta) data. Unmatched unknown columns are skipped silently. Define the fields first under Custom Fields & Fieldsets and bind the fieldset to the category if you want those columns captured.
Checkout on import
If a row carries checkout columns, the importer tries to resolve the assignee in this order:
Username (matched against a user's email or the part before the @, since ERPat
has no username field) → Email → full name. When a staff user resolves, the asset is
imported already assigned: Issued to is set, the issue date is stamped, and the endorsement
status becomes Assigned. If checkout
columns are present but nobody resolves, the row still imports — unassigned — with the warning
reason assignee_unresolved.
Reading the result
When the import finishes, the modal shows the one-line summary
"Import complete: %d created, %d updated, %d skipped." (also raised as a toast) and the
registry table reloads. The server actually returns per-row detail (created / updated / skipped
with reasons like already_exists and assignee_unresolved), but the
current modal renders only the summary line — if you need to know exactly which rows were skipped,
diff your file against a fresh export.
Export Assets (XLSX)
Click "Export Assets" on the registry toolbar (permission asset_export). The
modal collects optional filters and a column picker, then the "Export" button streams
assets.xlsx in a new browser tab and closes the modal.
Filters
| Filter | Type | Notes |
|---|---|---|
| "Category" | Dropdown, optional | Breadcrumbed category names. |
| "Location" | Dropdown, optional | Breadcrumbed location names. |
| "Status" | Dropdown, optional | Status labels. |
| "Issued to" | Dropdown, optional | Active staff users. |
Leave everything blank to export the whole registry.
The "Columns" picker & what the XLSX contains
A scrollable checkbox list, all checked by default. It contains the 19 core columns — written with the importer's canonical headers so the file round-trips straight back through Import Assets — plus every distinct custom field across all categories, exported under its field label:
- Core: "Asset Tag", "Name", "Serial Number", "Category", "Manufacturer", "Model Name", "Model Number", "Status", "Warranty", "Purchase Date", "Purchase Cost", "Order Number", "Supplier", "Location", "Requestable" (exported as "Yes"/"No"), "Notes" (the description), "Image" (stored filename), "Checked Out To" (assignee's legal name), "Email" (assignee's email).
- Custom fields: one column per distinct field key defined in any category's schema, with the asset's stored value (see Custom Fields & Fieldsets).
Untick boxes to slim the file. If you untick everything, the export falls back to all columns. "Model Name"/"Model Number" prefer the Asset Model catalog entry; assets without a linked Asset Model fall back to the free-text Model field for "Model Name" and leave "Model Number" blank.
Print asset labels (QR + barcode PDF)
Click "Print asset labels" on the registry toolbar (permission asset_export).
The modal offers two optional filters — "Category" and "Location" — and a
"Print asset labels" submit button (print icon). Leaving both filters blank selects
all assets.
How the PDF flow works
-
Choose the scope
Pick a Category and/or Location, or leave both blank for every asset. If nothing matches, you get the warning "No record found." and no PDF opens.
-
Prepare
Submitting counts the matching assets and splits them into PDF batches of up to 102 labels each.
-
PDF tabs open
One browser tab opens per batch, each rendering
AssetLabels.pdfinline. If your browser blocks the tabs you'll see the alert "Please allow popups for this website" — allow popups for your ERPat site and print again. -
Print
Print each tab from the browser's PDF viewer onto label stock or plain paper; the dashed divider and row rule are your cut guides.
What each label contains
Labels render as full-width rows flowing down the page (the PDF paginates automatically as rows fill each sheet), each row split into two halves by a vertical dashed divider (rows are separated by a solid rule):
- Left half (35%)
- A QR code encoding the module/action/tag triple
["assets","view","<TAG>"]— designed for a scanner app to resolve straight to the asset's detail page — with the tag text printed beneath it. - Right half (65%)
- Your company name (the
company_namesetting), a Code-128 barcode of the tag, the tag text again, and the asset title in small print. - <TAG>
- The asset's Asset Tag; assets without one fall back to
AST-+ the zero-padded id (e.g.AST-000042) — the same fallback the importer's auto-tagging uses.
AST-… id fallback. That
fallback exists only on the printed label — the asset's Asset Tag field stays blank in ERPat —
so if you assign a real tag later, the old sticker no longer matches: tag first, then print.
SOP — Bulk onboarding an inventory via import
Who: IT Admin / asset controller holding
asset, asset_import,
asset_export, and ideally asset_update.Preconditions: Assets module enabled; custom fields and fieldsets defined and bound to categories if the sheet carries extra columns; assignees exist as active staff users with correct emails.
-
Start from the template
Open "Import Assets" → "Export Excel" to download
assets-import-template.xlsx, or take a raw Snipe-IT CSV export as-is. One row per asset; make sure every row has a unique Asset Tag (or leave tags blank and let ERPat auto-generateAST-…tags). -
Pre-create schema-dependent masters
Categories, locations, brands, vendors, status labels, and models are auto-created, so you don't have to pre-create them — but if your sheet carries custom-field columns, define those fields and bind the fieldset to the category first (see Custom Fields & Fieldsets), otherwise those columns are silently skipped.
-
Dry-run with a small batch
Import 5–10 rows first, with "Update existing assets" unticked. Check the summary ("Import complete: …"), then spot-check one asset's Edit modal for custom-field values and the registry columns for category/model/vendor resolution.
-
Run the full import
Upload the full file. If you are re-running after fixing data, tick "Update existing assets" — matching tags are refreshed and blank cells leave existing values alone, so re-runs are safe and idempotent.
-
Review auto-created masters
Visit Categories, Models, Locations, and especially Status Labels — imported status labels arrive as deployable teal regardless of name, so re-type "Broken"-style labels to Undeployable and archive-style labels to Archived.
-
Verify assignments
Rows with checkout columns import as Assigned but log no timeline event. Filter the registry by Issued to to verify, and if your process requires a confirmed receipt, have each assignee open their asset and click Confirm receipt — see Checkout & Check-in.
-
Export a baseline & print labels
Run "Export Assets" with all columns to archive a day-one snapshot, then "Print asset labels" per location to sticker the fleet. You are now ready to start the audit cadence (see Auditing Assets).