Workflows & SOPs
The whole Safekeep module, wired together. This page walks you through seven end-to-end Standard Operating Procedures — from commissioning a newly purchased laptop, through endorsing it to an employee with a signed receipt, to auditing, repairing, and finally retiring it. Each SOP names the exact screen and button for every step, quotes the confirmations and error messages you will meet, and links to the feature page behind it.
The master asset pipeline
Every SOP on this page is a slice of one long custody loop. Read left to right: you plan and procure the asset, register it in the registry, deploy it by endorsing it to a user, operate it (audit on a cadence, maintain as needed), depreciate its book value monthly, and eventually retire it. Every lifecycle action along the way — checkout, receipt, return request, check-in, audit, each new maintenance record — appends one event to the asset's Activity chain-of-custody timeline (plain Edit-form changes log as change-note comments instead).
Which SOP covers which stage
| SOP | Pipeline stage | Covers | Feature pages |
|---|---|---|---|
| 1 · Commission & register | Register | Add entry / Clone → tag & serial discipline → print labels → Ready to Deploy | Adding & Editing Assets, Labels |
| 2 · Bulk onboarding (CSV) | Register | Template / Snipe-IT export → upload → auto-created lookups → summary | Import, Export & Labels |
| 3 · Issue to an employee | Deploy | Check out → assignee confirms receipt (EULA caveat) → in use | Checkout & Check-in |
| 4 · Return & redeploy | Operate | Request return → check in with condition → In Repair or Ready to Deploy | Checkout & Check-in |
| 5 · Periodic audit cycle | Operate | Audit-due report → Record audit → next cadence → reminders | Auditing Assets, Asset Reports |
| 6 · Repair & maintenance | Operate | Log maintenance → warranty work → cost capture → manual status juggling | Maintenance |
| 7 · Retire / lost / dispose | Retire | Check in if assigned → Archived or Lost / Stolen → final note → delete vs archive | Status Labels, Asset Detail |
compute_asset_depreciation cron
does it unattended on the 1st of each month (see Depreciations
and Widgets, Reminders & Settings).
SOP 1 — Commission & register new assets
asset_create (plus asset_export to print labels; Clone is admin-only).
Preconditions: the module is enabled; the Category you need
exists (the seed ships Laptop, Phone, Monitor, Vehicle, Access card and Employee ID); the seven
seeded Status Labels are in place.
-
Prepare the catalog (once per hardware model)
If this is a model you will buy repeatedly, register it first: Safekeep → Assets → Models tab → "Add Asset Model" with its Category, Manufacturer, Fieldset, Depreciation profile and EOL months. Picking that Asset Model on the asset form later auto-fills Category and Brand when they are still blank. Details on Asset Models.
-
Open the add form
Go to Safekeep → Assets (the Browse tab) and click "Add entry" in the toolbar (needs
asset_create). Only two fields are hard-required: "Title" and "Category". Every field is documented on Adding & Editing Assets. -
Apply tag & serial discipline
Fill "Asset Tag" and "Serial no." now, while the box is open in front of you.
⚠️The add form does not auto-generate a tag — only the CSV importer does (AST-+ zero-padded id, e.g.AST-000123). The label PDF falls back to that same pattern when the tag is blank, and Asset Tag is the sole dedupe key for imports — untagged assets cannot be bulk-updated later. Assign a unique tag at registration, every time. -
Capture the procurement facts
Enter "Cost", "Purchase date", "Warranty expiry date", "Warranty (months)", "Order Number" and "Vendor" while the invoice is at hand — Cost and Purchase date are also what qualifies the asset for the depreciation computation. Complete the category's "Additional fields" block; required custom fields reject the save with "%s is required."
ℹ️These purchase fields are visible afterwards in the Edit modal and the XLSX export (Cost, Purchase date, Warranty expiry date and Vendor also appear as asset-list columns) — the asset detail page does not display photo, cost, purchase date, warranty, order number, condition or custom-field values. -
Set the status to Ready to Deploy
Pick "Status" = Ready to Deploy. The form does not set a status for you, and an asset with no status at all skips the deployability guard at checkout — always set one so the status gate can protect you later. Click "Save" — toast: "The record has been saved." The Description you typed is pinned as the asset's first comment.
-
Clone for identical units (admin only)
Bought five identical laptops? Save the first, then open its row menu on Browse and click "Clone" (shown to admins only). The same modal opens with a "Duplicate" count field — set it to 4 and Save to create four more rows. Cloned rows are fresh creations with no change log or events. Edit each clone to give it its own Asset Tag and Serial no. — the clone copies the source's values.
-
Print and affix the labels
Back on Browse, click "Print asset labels" (needs
asset_export), filter by Category and/or Location, and submit. PDFs open in new tabs at 102 labels per page — if nothing opens you will see the alert "Please allow popups for this website". Each label carries a QR code and a Code-128 barcode of the tag. Stick them on before the assets leave the storeroom. Full detail on Import, Export & Labels.
SOP 2 — Bulk onboarding via CSV / Snipe-IT import
asset_import.
Preconditions: the file is .csv, .xlsx or .xls;
if you intend to re-import updates later, every row has a stable Asset Tag.
-
Get the template — or use a Snipe-IT export as-is
On Safekeep → Assets → Browse, click "Import Assets". In the modal footer, click "Export Excel" to download
assets-import-template.xlsxwith the canonical headers. If you are migrating from Snipe-IT you can skip the template — the modal's own help says: "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)." -
Prepare the file
One row per asset. Headers are matched case-insensitively with generous aliases ("Serial" = "Serial Number", "Cost" = "Purchase Cost", …). Any extra column whose header matches a custom field in the row's category lands in the asset's Additional fields. The full header map is on Import, Export & Labels.
-
Upload and choose the update mode
Attach the file (a wrong type is rejected with "Please upload an excel file. (.csv / .xlsx)"). Tick "Update existing assets" if rows with a matching Asset Tag should be refreshed — blank cells never overwrite existing values. Left unticked, matching rows are skipped. Click "Next", then "Upload".
-
Let the importer build the catalog for you
Missing lookups are auto-created by exact (case-insensitive) name: Categories, Locations, Manufacturers (into the shared Brands list), Suppliers (shared Vendors), Asset Models, and Status Labels — auto-created status labels arrive as deployable, teal. New rows without a tag get one generated as
AST-000123-style. -
Understand checkout-on-import
If the file has Snipe-IT checkout columns ("Checked Out To" / "Username" / "Email" …), the importer resolves the assignee and imports the asset already Assigned.
⚠️Import checkouts write no "Endorsed" event — the assignment shows in the lifecycle summary but not in the Activity timeline. If the assignee cannot be resolved, the row imports unassigned with the warningassignee_unresolved. Ask imported holders to open their asset and "Confirm receipt" (SOP 3, step 5) so the custody chain gets a signed entry. -
Read the summary and spot-check
The modal reports "Import complete: %d created, %d updated, %d skipped." and the table reloads. Spot-check a few rows — Category breadcrumbs, Status, Issued to — then print labels for the new arrivals (SOP 1, step 7).
SOP 3 — Issue an asset to an employee
asset_checkout performs the checkout; the employee themselves (or an admin)
confirms receipt — that step has no permission key. Preconditions: the asset is
registered, not currently checked out, and its status label is a Deployable type
(Ready to Deploy or Deployed).
The endorsement lifecycle this SOP starts:
-
Open the asset and start the checkout
On Safekeep → Assets → Browse, click the asset's Title to open its detail page, then Actions → "Check out asset".
⛔Two guards can stop you: "This asset is already checked out." and "This asset's status is not deployable, so it cannot be checked out." — the latter fires on Pending, In Repair, Broken, Lost / Stolen and Archived. An asset with no status at all is not blocked, which is why SOP 1 insists on setting one. -
Fill the checkout modal
Pick "Endorsed to" (required — active staff users only; there is no checkout-to-location or checkout-to-asset), optionally a "Due / return by" date and a "Note (optional)", then click "Check out". Toast: "Asset checked out." The lifecycle panel now shows the holder with an Assigned chip, and the Activity timeline gains an Endorsed event titled "Checked out to %s".
ℹ️Checkout does not change the Status Label. If your convention is to flip issued units to Deployed, do it manually via Actions → Edit → "Status". -
Tell the employee
No notification is sent at checkout. The employee sees the asset on their "Assets assigned to me" dashboard widget (in the default widget set) with status Assigned — but hand-over works best with a direct heads-up: "your laptop is in the system, please confirm receipt." The automated reminders (crons) only cover return-due, warranty and audit.
-
Physically hand the asset over
Give the unit to the employee against the printed label/tag. The custody record still says Assigned — the confirmation is the employee's job, which keeps the receipt honest.
-
Employee confirms receipt
The employee opens the asset (widget link or Safekeep → Assets) and clicks Actions → "Confirm receipt". This entry appears only to the current assignee. If the asset's category requires acceptance, the modal shows the "Acceptance agreement" text, a required checkbox "I have read and accept the terms above." and a required "Type your full name to sign" field — skipping them is rejected with "Please tick the box to accept the terms." / "Please type your full name to accept the agreement." Otherwise the modal is a plain confirmation. Click "Confirm receipt".
⚠️EULA caveat: there is no admin screen to turn the acceptance agreement on — the category'srequire_acceptanceflag andeula_textcan only be set directly in the database. Until your administrator does that, "Confirm receipt" is a simple confirmation without terms or signature. See Categories. -
In use — the steady state
Toast: "Receipt confirmed." The chip flips to Acknowledged and the timeline records an Acknowledged event ("Receipt confirmed.", with "Signed: %s" and a frozen copy of the accepted agreement when a signature was required). From here, if a "Due / return by" date was set, the holder gets the daily reminder "An asset assigned to you is due to be returned" starting 3 days before it — see Widgets, Reminders & Settings. Full lifecycle detail: Checkout & Check-in.
SOP 4 — Return & redeploy
asset_checkout performs the check-in. Preconditions: the
asset is currently checked out.
-
(Optional) Employee requests the return
On the asset's detail page, the assignee clicks Actions → "Request return", adds a "Note (optional)", and submits. Toast: "Return requested"; the chip becomes Return requested and a Return requested event lands on the timeline. Nothing else changes — the employee keeps the asset until a custodian checks it in. This step is optional: a custodian can check in directly at any time.
-
Receive the unit and open the check-in modal
With the asset physically back in hand, a user with
asset_checkoutopens Actions → "Check in asset". Anyone with the permission may check in — it does not have to be whoever requested or performed the checkout. -
Record condition and set the next status
The modal shows the read-only "Endorsed to", plus "Condition" (free text — overwrites the asset's stored condition if filled), "Set status to" (optional dropdown), and "Note (optional)". Inspect the unit and choose:
Ready to DeployGood conditionback to the shelf, available for SOP 3In RepairNeeds workcontinue with SOP 6 — this status blocks re-checkoutClick "Check in".
⚠️If you leave "Set status to" blank, the old status stays — e.g. an asset you marked Deployed remains "Deployed" while sitting unassigned on a shelf, and since Deployed is a deployable type it can be checked out again as-is. Statuses never move themselves; set one deliberately at every check-in. -
Verify the record
Toast: "Asset checked in." The assignment is fully cleared (holder shows "Not assigned"), the endorsement chip reads Returned, and the timeline records a Returned event titled "Checked in from %s" naming the previous holder.
-
Redeploy
A Ready-to-Deploy unit re-enters the pool immediately — issue it to the next employee with SOP 3. A repaired unit comes back via SOP 6 step 6 first.
SOP 5 — Periodic audit cycle (quarterly)
asset_audit; typically an auditor or custodian walking the floor. Preconditions:
assets carry a Next Audit date. Each recorded audit schedules the next one; for the very
first cycle, seed the dates via the asset Edit form's "Last Audit" / "Next Audit"
fields or simply audit everything once.
-
Pull the worklist from the Audit due report
Go to Safekeep → Asset Reports and open the "Audit due" tab. It lists every asset whose Next Audit falls within the next 30 days (a fixed window), sorted soonest-first, with a red Overdue badge on anything already past due. Columns include Asset Tag, Category, and "Endorsed to" so you know whose desk to visit. Detail: Asset Reports. The "Assets needing attention" dashboard widget shows the same due items with a blue "Audit due" badge if you have added it.
-
Verify the physical asset
Find the unit, match the label's tag/QR against the record, confirm the holder matches "Endorsed to", and note its condition. Discrepancies branch out: unit missing → SOP 7 (Lost / Stolen); unit damaged → SOP 6 (repair); wrong holder → fix the custody record via check-in and re-checkout (SOP 4 then SOP 3).
-
Record the audit
On the asset's detail page, click Actions → "Audit asset". The modal shows "Condition" (prefilled with the current value — update it if changed), "Schedule next audit in (days)" (prefilled 90 — the quarterly default), and "Note (optional)" for findings. Click "Record audit". Toast: "Audit recorded."
ℹ️The 90-day default comes from the settingasset_audit_cadence_days, which has no settings screen — unless your administrator inserts it directly in the database, the prefill is always 90. You can still type any number per audit. -
Confirm the schedule rolled forward
The asset's Last Audit becomes today and Next Audit = today + the days you entered; the timeline records an Audit event titled "Audited on %s", with "Condition: %s." prepended to your note when a condition was entered.
-
Let the reminders carry the cadence
The weekly cron (Mondays 08:00) notifies each holder whose asset is due for audit within 7 days: "An asset assigned to you is due for audit". Unassigned assets never trigger a notification — they surface only on the Audit due report and the attention widget, so end each quarter by re-checking the report for stragglers. See Widgets, Reminders & Settings and Auditing Assets.
SOP 6 — Repair & maintenance
asset_maintenance (viewing the Maintenance list only needs
the base asset permit). Preconditions: the asset exists in the registry;
the servicing vendor exists in the shared Vendors list if you want to record it.
-
Take the asset out of circulation — manually
If the unit is endorsed and physically leaving its holder, check it in first (SOP 4) and use the check-in modal's "Set status to" = In Repair. If it is already in stock, open the asset and set Actions → Edit → "Status" = In Repair. In Repair is seeded as a Pending-type label — not deployable — so it blocks accidental checkout while the unit is away.
⚠️All status juggling in this SOP is manual. Logging a maintenance record never changes the asset's status or assignment, and completing the work never restores it — you set the status going in (this step) and coming out (step 6) yourself. -
Log the maintenance record
Go to Safekeep → Maintenance and click "Add Maintenance" (needs
asset_maintenance). Required: "Asset" and "Title". Classify with "Maintenance Type" — "Maintenance", "Repair", "Upgrade", "Calibration", "Hardware Support" or "Software Support" — pick the "Vendor", set the "Start date", and describe the job in "Notes". Click "Save" — "The record has been saved." Full field reference: Maintenance. -
Flag warranty work
If the repair is covered, tick "Warranty work" — the list and the Maintenance log report show it as Yes/No, which is your evidence trail that covered repairs were claimed rather than paid. Check coverage first via the asset's "Warranty expiry date" / "Warranty (months)" in its Edit modal (these are not shown on the detail page). The attention widget and the daily 07:30 cron flag warranties expiring within 30 days — a good prompt to squeeze in covered repairs before coverage lapses.
-
Capture the cost
Enter "Cost" as a plain number (the module stores and shows it without a currency symbol — record your standing amounts in pesos consistently). Finance can total spend per vendor and per asset later from Safekeep → Asset Reports → "Maintenance log", which mirrors the Maintenance list read-only.
-
Close the job with a completion date
Maintenance has no status field — a record with a Start date and no Completion date is understood as ongoing. When the work is done, edit the record (pencil icon) and set "Completion date".
ℹ️The asset's Activity timeline gets a Maintenance event only when the record is created — later edits (including the completion date) and even deletion do not update or remove that timeline entry. Treat the Maintenance screen, not the timeline, as the source of truth for job state and cost. -
Return the asset to service
Update the asset's condition if it changed (quickest via a recorded audit, SOP 5 step 3, or the Edit form's "Condition" field), set Status back to Ready to Deploy via Actions → Edit, and redeploy with SOP 3. If the unit is beyond repair, set Broken and continue with SOP 7.
SOP 7 — Retire, lost / stolen & disposal
asset_checkout and asset_update (plus asset_audit for
the closing audit in step 3); asset_delete only if you genuinely delete a record. Preconditions: the decision (retire / write off / report
stolen) has been made; if the asset is endorsed, you know its last holder.
-
If the asset is assigned, check it in — status included
Setting a status never clears an assignment, so an endorsed asset must be checked in explicitly. Open Actions → "Check in asset" and do the whole retirement in one modal: record the final "Condition" ("water-damaged, board corroded"), use "Set status to" = Archived (retiring) or Lost / Stolen, and put the circumstances in "Note (optional)" — for a loss, name the last holder in the note, because check-in clears the assignment fields (the timeline's "Checked in from %s" event preserves who had it).
-
If the asset is unassigned, set the terminal status directly
Open Actions → Edit and set "Status" to Archived (planned retirement / disposal) or Lost / Stolen. Both are non-deployable types, so any future checkout attempt is stopped with "This asset's status is not deployable, so it cannot be checked out."
-
Record the closing entry
Give auditors one dated, human-readable closure on the record. The cleanest way is a final audit: Actions → "Audit asset", condition + note ("Retired 2026-07-03, disposed via accredited e-waste recycler, ref. DR-1042"), "Record audit". Alternatively post a comment (needs
asset_comment) — comments can be deleted but never edited, so write it final. For stolen assets, keep the police-report or incident number in the note. -
Settle the finance side
Pull the asset's last computed book value from Safekeep → Asset Reports → "Depreciation schedule" ("Current value" / "Computed at" columns) for your write-off entry. The module records custody, not accounting — the disposal journal itself lives in your books/BIR lapsing schedule outside Safekeep. Note that archived assets keep appearing in this report while they still have a cost, purchase date and depreciation profile. See Depreciations.
-
Archive vs delete — choose deliberately
⛔Prefer Archived; reserve Delete for mistakes. An Archived asset stays searchable with its full Activity timeline, comments and audit trail, and still appears in exports — exactly what an auditor asks for years later. Delete (row menu → "Delete", needsasset_delete) is a soft delete — "The record has been deleted." — that removes the asset from every list, report and export with no in-use check and no undelete screen. Delete duplicate or erroneous records; archive real assets that reached end of life. -
The unit comes back? Reverse it
A "lost" asset that turns up is one edit away from service: Actions → Edit → "Status" = Ready to Deploy, record an audit noting the recovery, and it is deployable again via SOP 3.
Quick reference — guards you will meet
| Where | Exact message | What it means |
|---|---|---|
| Checkout | "This asset is already checked out." | Check it in first (SOP 4) before endorsing to someone else. |
| Checkout | "This asset's status is not deployable, so it cannot be checked out." | The status label's type is Pending, Undeployable or Archived. Change the status if deployment is really intended. |
| Acknowledge / Return / Check-in | "This asset is not currently assigned." | The lifecycle action needs an active endorsement. |
| Acknowledge (EULA) | "Please tick the box to accept the terms." / "Please type your full name to accept the agreement." | Acceptance and signature are mandatory when the category requires acceptance. |
| Asset form | "%s is required." / "%s must be a number." | A category custom field failed validation. |
| Import | "Please upload an excel file. (.csv / .xlsx)" | Only .csv / .xlsx / .xls files are accepted. |
| Label printing | "Please allow popups for this website" | The label PDFs open in new tabs; unblock popups and retry. |
For every term and status vocabulary used above — endorsement statuses, deploy types, the seven seeded labels — see Glossary & Legends. For the full permission matrix behind each SOP's "Who", see Permissions & Roles. When a step misbehaves, FAQ & Troubleshooting lists the common causes.