Assets Reference Public

Import, Export & Labels

Daily Operations 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…

Guide version: r1 Module version: 1.0.0 Updated: 2026-07-22 Estimated time: 13 min 2 views
Daily Operations

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.

Import Assets

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.

Export Assets

Toolbar button "Export Assets" (cloud-download icon). Filtered XLSX with a column picker — including every custom field. Needs the asset_export permission.

Print asset labels

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.

ℹ️
All three buttons sit top-right of the Browse tab on 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.

????
Migrating from Snipe-IT? Export your assets from Snipe-IT as CSV and upload the file as-is. Headers are matched case-insensitively (with trimming and BOM stripping), unknown columns are skipped silently — the same forgiving behavior Snipe-IT itself uses — and missing categories, models, manufacturers, suppliers, locations, and status labels are created on the fly. Even the checkout columns (Checked Out To / Username / Email) are honored, so assignments carry over.

The import flow, step by step

  1. 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".

  2. 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.

  3. Upload the file

    Drop or pick your file. Only .csv, .xlsx, and .xls are accepted — anything else is rejected with "Please upload an excel file. (.csv / .xlsx)". Decide whether to tick "Update existing assets" (see dedupe semantics below).

  4. Click "Next", then "Upload"

    The file type is checked during upload — only .csv / .xlsx / .xls pass. The "Next" button enables once the file finishes uploading; clicking it stages the file and reveals the "Upload" button, which runs the import.

  5. 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."

ℹ️
The modal's own help text sums up the contract: "Upload a CSV or XLSX. A raw Snipe-IT asset export imports directly — headers are matched case-insensitively. Asset Tag is the dedupe key; tick "Update existing assets" to refresh matching rows (blank cells are ignored)."

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 headerAccepted aliasesFills / behavior
Asset Tagasset_tag, TagThe dedupe key. Blank on a new row → tag auto-generated as AST- + zero-padded id (e.g. AST-000123).
NameItem Name, Asset NameThe asset's Title.
CategoryMatched by name (case-insensitive); created if missing. Drives which custom fields apply.
Model NameModelAsset Model catalog entry, matched by name + model number; created if missing.
Model NumberModel No., Model NoPart of the Asset Model match.
ManufacturerMakeMatched/created as a Brand (flagged for assets).
Serial NumberSerial, Serial NoSerial no. field.
StatusStatus LabelMatched by name; created if missing as a deployable, teal (#1d97a6) status label. See Status Labels.
WarrantyWarranty Months, Warranty (Months), Warranty ExpiresAccepts an integer month count or a date (months derived from the purchase date).
Purchase DatePurchasedParsed flexibly (strtotime).
Purchase CostCostCurrency symbols and thousands separators are stripped (₱, commas, etc.).
Order NumberOrder Number field.
SupplierVendorMatched/created as a Vendor.
LocationMatched by name; created if missing. See Locations.
NotesThe asset Description (also pinned as the asset's first comment).
ImageOnly the file's basename is kept.
RequestableAccepts 1 / yes / y / true / t / x. Stored, but note: there is no request-an-asset workflow in the UI yet.
Checked Out ToFull NameCheckout-on-import columns — see below. Also accepted: Checkout Type (alias Type), Username, First Name, Last Name.
Email

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 existsOff (default) Skipped Row is skipped (reason already_exists) and counted in the summary's "skipped" figure.
Tag already existsOn 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.
⚠️
Because blank cells are ignored on update, you cannot clear a field via import (e.g. blank out a serial number). Do that through the Edit modal on the asset form instead.

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) → Emailfull 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.

⚠️
Import checkouts do not log an event. Unlike a normal Check out asset action, an assignment made by the importer writes no "Endorsed" entry to the asset's Activity timeline — the assignment shows only in the Endorsed to summary chip. Imported assignments also skip the deployability check. The assignee can still open the asset afterwards and use Confirm receipt as usual.

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

FilterTypeNotes
"Category"Dropdown, optionalBreadcrumbed category names.
"Location"Dropdown, optionalBreadcrumbed location names.
"Status"Dropdown, optionalStatus labels.
"Issued to"Dropdown, optionalActive 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.

????
The export is where you audit "Additional fields". The asset detail page does not display custom-field values, cost, purchase date, or warranty — the Edit modal and this XLSX are the only places to see them, and only the XLSX shows them across many assets at once. It's also the practical backup format: export regularly and you always have a re-importable snapshot.
ℹ️
Don't confuse this with the registry table's built-in quick Excel export, which covers only the first five visible columns (Title through Type). For anything real, use "Export Assets". See The Asset Registry.

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

  1. 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.

  2. Prepare

    Submitting counts the matching assets and splits them into PDF batches of up to 102 labels each.

  3. PDF tabs open

    One browser tab opens per batch, each rendering AssetLabels.pdf inline. 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.

  4. 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_name setting), 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.
????
Give every asset a real Asset Tag before printing labels — the tag is what both codes encode, what auditors scan, and the import dedupe key. Assets created through the add form do not get a tag automatically (only the importer auto-generates them), so untagged assets print with the 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

????
Purpose: Load an existing asset inventory (spreadsheet or Snipe-IT export) into ERPat in one pass, with clean masters, correct assignments, and printed labels.
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.
  1. 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-generate AST-… tags).

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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).

Related pages

Was this guide helpful?

Report a content problem