Auditing Assets
A physical audit is the moment you prove the registry is true — you find the asset, check who actually holds it and what shape it is in, and stamp the record. Safekeep gives you a one-click Record audit action, an automatic next-audit schedule, an Audit due report, and a weekly reminder so audits never silently lapse.
ams/assets/view/…) via the Actions dropdown → "Audit asset". It requires
the asset_audit permission ("Assets: Audit" in the Roles screen — see
Permissions & Roles). The companion Audit due report is the
second tab of Asset Reports at ams/reports/audit_due.
Why audit?
The registry records what should be true: this laptop is endorsed to Maria, it is in the Makati office, its condition is "Good". Between checkouts and check-ins, months can pass with nothing forcing anyone to look at the physical unit. A periodic audit closes that gap — it is the chain-of-custody assurance step that confirms the asset still exists, is still with its recorded holder, and is still in the recorded condition. For finance and compliance teams, a dated audit trail (every audit writes an Audit event into the asset's Activity timeline and the Activity log report) is what turns the asset list into evidence you can hand to an external auditor or use for a BIR-style fixed-asset count.
Auditing in Safekeep is a self-renewing loop: each recorded audit schedules the next one, and the report and reminder surface whatever falls due.
Recording an audit
Open the asset's detail page and choose Actions → "Audit asset" (magnifying-glass icon).
The menu item is always available on any asset — checked out or not, whatever its status label — as long
as you hold asset_audit. The audit modal has four fields:
| Field | Input | Required | Notes |
|---|---|---|---|
| "Asset" | Read-only | — | The asset's title, shown so you can confirm you opened the right record. |
| "Condition" | Free text | Optional | Prefilled with the asset's current condition. If you type anything here, it overwrites the
asset's condition field and is prepended to the audit note as
"Condition: %s." Leave it blank to keep the stored condition untouched. |
| "Schedule next audit in (days)" | Number | Optional | Prefilled from the asset_audit_cadence_days setting, falling back to 90 days.
You can override it per audit — type 30 for a high-risk asset, 365 for furniture. A blank or
zero value falls back to the setting, then to 90. |
| "Note (optional)" | Textarea | Optional | Free-text findings — location observed, missing accessories, sticker replaced, etc. Becomes the body of the Audit event in the Activity timeline. |
Submit with the footer button "Record audit".
What recording an audit does
- Last Audit
last_audit_dateis set to today (UTC date).- Next Audit
next_audit_dateis set to today + the cadence days you entered. This is the date the Audit due report, the "Assets needing attention" widget, and the weekly reminder all watch.- Condition
- Updated only if you typed something in the Condition field.
- Activity timeline
- One Audit event is written: chip Audit, title "Audited on %s" (the formatted date), body = your note — with "Condition: %s." prepended when a condition was entered. The event also appears in the Activity log report with type "Audit".
- Confirmation
- Toast "Audit recorded.", then the page reloads. The lifecycle summary panel's "Next Audit" column shows the new date immediately.
asset_audit_cadence_days setting, but no UI anywhere writes that setting — unless an
administrator inserts it directly in the database, the modal will always suggest 90 days. In
practice, treat 90 as the system default and override the number per audit when you need a different
cadence. (Same situation as asset_warranty_reminder_days — see
Widgets, Reminders & Settings.)
The Audit due report
Open Asset Reports and pick the "Audit due" tab
(ams/reports/audit_due). It lists every asset whose Next Audit date falls on or
before today + 30 days — which inherently includes everything already overdue. Anyone with the
base asset permission can view it (reports have no per-report permission).
| Column | What it shows |
|---|---|
| "Title" | The asset title, linked to its detail page. Assets whose Next Audit is already in the past get a red Overdue badge appended. |
| "Asset Tag" | The tag you'll match against the physical label. |
| "Category" | The asset's category. |
| "Endorsed to" | The current holder's name, or "-" if unassigned — this is who you visit during the sweep. |
| "Last Audit" | When it was last audited. |
| "Next Audit" | When the next audit is due. Default sort is by this column, ascending — most-urgent first. |
Assets that never had an audit recorded and have no Next Audit date at all do not appear in the
report — the report keys entirely on next_audit_date. Give every tracked asset an initial
Next Audit date (via a first audit or the Edit form) to bring it into the cycle.
The weekly audit reminder
The cron job "Remind asset audit due" (slug remind_asset_audit_due) runs
every Monday at 08:00 and looks for assets whose Next Audit date is on or before
today + 7 days — overdue audits included. For each match it notifies the asset's current
holder (the "Issued to" user) through the standard notification pipeline: an in-app web notification
plus an email (general notification template, subject to the user's own notification preferences). The
notification reads:
- Unassigned assets are skipped. The job only ever notifies a holder — an asset sitting in storage with no "Issued to" user generates no reminder. Those assets surface only through the Audit due report and the "Assets needing attention" widget (blue Audit due badge), so build your sweep from the report, not from who got nagged.
- No dedupe. The reminder repeats every Monday until someone records an audit (or edits the Next Audit date forward). Persistent reminders are the feature, not a bug.
- The holder can't necessarily record the audit themselves — recording requires the
asset_auditpermission. Unless the holder's role includes it, the reminder's practical effect is that the holder brings the asset to (or expects a visit from) the auditing team.
Like all Safekeep jobs, it is enabled by default and runs per tenant; administrators can inspect or
trigger it with php erpat cron:list / cron:run remind_asset_audit_due. Full
cron details are on Widgets, Reminders & Settings.
SOP — quarterly audit sweep
Who: an IT admin or asset custodian with
asset_audit (plus asset_checkout,
asset_update and asset_maintenance for handling exceptions).Preconditions: Assets module enabled; assets carry Next Audit dates (a first audit or seeded dates); ideally assets are tagged with printed QR labels (Import, Export & Labels).
-
Pull the audit-due list
Open Asset Reports → "Audit due". It is already sorted by Next Audit ascending, so the top rows are the most overdue — anything with the red Overdue badge goes first. Note each row's "Endorsed to" holder and "Asset Tag"; that is your route sheet for the sweep.
-
Locate the asset
Visit the listed holder (or the asset's recorded Location for unassigned units). Match the physical unit against the record by Asset Tag — scan the QR label if one is printed, or compare the tag and serial number on the asset's detail page.
-
Verify holder and condition
Confirm the person actually holding the asset is the recorded "Endorsed to" user, and inspect the unit's physical condition. Check the detail page's lifecycle panel while you're there — an endorsement stuck at Assigned (never acknowledged) or at Return requested is worth chasing during the same visit (see Checkout & Check-in).
-
Record the audit
On the asset's detail page: Actions → "Audit asset". Update "Condition" if it changed, describe findings in the note, accept or adjust "Schedule next audit in (days)", and click "Record audit". Wait for the "Audit recorded." toast — Last Audit and Next Audit are now stamped and the asset drops off the due list.
-
Handle exceptions
When reality doesn't match the record, fix the record before moving on:
Wrong holder or asset abandoned — check the asset in (Actions → "Check in asset") and, if appropriate, check it out to the real holder so the endorsement trail is honest.
Damaged or faulty — set the status to In Repair or Broken via Edit or during check-in ("Set status to"), then log the repair on the Maintenance screen. Remember a non-deployable status blocks future checkout (see Status Labels).
Cannot be found — set the status to Lost / Stolen and record the search details in the audit note or a comment so the trail shows when it was last seen.
Moved — update the asset's "Location" via Edit. -
Close the sweep
Re-open the Audit due report — it should now show only next quarter's early arrivals. Anything still listed is an unresolved exception. The Activity log report gives you the dated list of every "Audit" event recorded during the sweep, ready for your audit working papers.
More end-to-end procedures, including onboarding and offboarding sweeps, live in Workflows & SOPs.