Build an IT asset tracking system without a $50K platform
· Avery NXR
Your IT team is tracking 200 laptops, 80 monitors, and 600 software licenses in a Google Sheet. The sheet has comments going back two years explaining why certain rows look weird. Three people maintain it, none of them fully trust the others' edits. The CFO recently asked for an asset audit and the IT lead disappeared into the sheet for three days.
This is the default state of IT asset management at companies under 500 employees. The reason isn't laziness. The reason is that ServiceNow, Snipe-IT enterprise, and the other "real" platforms are built for orgs of a thousand plus employees with dedicated IT operations teams. The cost and complexity are out of proportion for smaller orgs, so the spreadsheet wins by default.
Spreadsheets fail at scale in three specific ways: no audit trail, no automated alerts, no role-based access. Each failure costs money quietly. Lost laptops don't get tracked. License renewals slip past their notice windows. Sensitive employee data sits in a sheet that everyone in IT can edit.
A custom Avery build solves all three failures in about three days. Here's how.
What IT asset tracking really needs
Five functional requirements cover 90 percent of the real use case:
An asset registry. Every laptop, monitor, phone, dock, license, and physical key with a unique ID and metadata (model, serial, purchase date, condition).
Assignment to employees. Who has what. With history (this MacBook went from Alice to Bob in March).
Status tracking. In use, in storage, retired, lost, stolen. With dates and notes.
License expiry alerts. Software licenses with renewal dates trigger emails 90, 60, and 30 days before expiry.
Audit trail. Every change (assignment, status, location, notes) logged with who, when, and what changed.
That's the entire system. Eight to ten Avery CRs.
What this doesn't do: imaging or device management (that's MDM, separate problem). Patch management. Endpoint security. Those are dedicated tools for a reason.
The Avery build
CR 1: Asset data model.
"Build an Asset model with id, asset_tag (unique), category (enum: laptop, desktop, monitor, phone, dock, peripheral, license, other), make, model, serial_number, purchase_date, purchase_cost_usd, status (enum: in_use, in_storage, retired, lost, stolen), location, condition (enum: new, good, fair, poor), notes, created_at. Add migrations and types."
CR 2: Assignment model with history.
"Build an AssetAssignment model with id, asset_id (FK), employee_id (FK to Employee or User), assigned_at, returned_at (nullable), assigned_by (FK to User), return_notes (nullable). When an asset is reassigned, mark the previous assignment with returned_at and create a new assignment record. Show assignment history on the asset detail page."
CR 3: Status workflow with audit.
"Build an AssetEvent model: asset_id (FK), event_type (enum: status_change, location_change, condition_change, notes_update), old_value, new_value, changed_by (FK to User), changed_at. On every Asset update, automatically create an AssetEvent. Show event history on asset detail page in reverse chronological order."
CR 4: License-specific fields and renewal engine.
"Add License-specific fields to Asset (when category = license): license_type (enum: per_seat, site, unlimited), seat_count, renewal_date, auto_renew (boolean), vendor, renewal_notice_period_days. Build a daily cron job that finds licenses where renewal_date is 90, 60, or 30 days from today and sends email to IT lead with renewal details."
CR 5: Bulk import.
"Build an /admin/assets/import page accepting CSV upload. Parse columns matching the Asset model. Validate, show preview with errors highlighted, allow user to confirm import. Log import as a single AssetEvent with import metadata. Used to load existing asset inventory from the spreadsheet."
CR 6: Asset list, filter, search.
"Build /admin/assets listing all assets with filters by category, status, location, condition, and assigned employee. Search by asset_tag, serial, model. Show pagination. Each row shows current assignment and last event date."
CR 7: Employee detail view.
"Build /admin/employees/[id]/assets showing all current assets assigned to that employee, plus historical assignments. Allow assigning a new asset from this page (search for available assets, link to existing AssetAssignment record)."
CR 8: License usage dashboard.
"Build /admin/licenses showing all active licenses with seat utilization (assigned seats / total seats), renewal dates, and total annual cost. Highlight underutilized licenses (<50% seats used) and expiring licenses (renewal in next 90 days). Sort by total annual cost descending."
CR 9: Role-based access.
"Add UserRole: admin, it_lead, it_staff, manager, employee. Admin and it_lead see and edit everything. it_staff sees and edits assets in their assigned location. Manager sees assets assigned to direct reports. Employee sees only their own assigned assets. Enforce at API and UI levels."
CR 10: Integration with Okta or Google Workspace.
"On employee deactivation in Okta (or Google Workspace) webhook, mark all that employee's assets as 'pending_return' status. Email the it_lead with a list of assets to recover. On asset return, allow IT to update status back to in_storage."
Ten CRs. Three days if you're focused, four if you go slow on the integrations.
What this saves
The license dashboard surfaces money you're already losing. A common pattern: a company buys a 100-seat license for a tool, three years pass, half the team has churned, but the license still renews for 100 seats every year. Nobody noticed because the license auto-renews via expense card and nobody questioned the invoice.
The dashboard makes this visible. License at 100 seats, only 35 actually assigned, renewing next quarter for the full $25K. Decision becomes obvious: renew at 50 seats for half the cost.
I worked with a company that found six underutilized licenses in their first month after building this. Annual savings exceeded the build effort by an order of magnitude.
The asset audit trail is the second-order win. When the CFO asks for an asset audit, the IT team queries the asset table and exports. Done in 10 minutes. Versus three days reconstructing from the spreadsheet.
Things that surprise people
The CSV import is the most important CR. Migrating from the spreadsheet is the hard part of the rollout. The import has to handle dirty data: duplicates, missing fields, asset tags that aren't actually unique. Budget extra time for the import logic. Validate strictly, surface errors clearly, let IT clean up in the existing sheet before importing.
The audit log can get noisy fast. Every field edit creates an event. After six months you have thousands of events. Add filters and pagination from day one or the events table becomes unusable.
Role-based access is where most teams get tangled. The temptation is to create a fine-grained permission system. Resist. Four or five roles cover real-world needs. More granularity creates more confusion than it solves.
The Okta or Google Workspace integration is the unlock for offboarding. When an employee leaves, their assets need to come back. Without an automated trigger, this slips and you lose laptops. The webhook integration is a single CR and dramatically reduces shrinkage.
What this costs to run
Standard small-SaaS stack.
Hosting: Vercel or Railway, $20 to $40 per month.
Database: Supabase or Neon, $25 to $50 per month.
Email: Resend free tier or $25 per month.
S3 for any uploaded photos (asset condition documentation): $5 to $20 per month.
Total: $50 to $135 per month.
Versus enterprise ITSM platforms at tens of thousands per year. The break-even is immediate.
When to upgrade to a real platform
You exceed 1,000 employees.
You need integration with MDM (Jamf, Kandji, Intune) for full lifecycle management.
You operate in heavily regulated industries (defense, healthcare, finance) with specific compliance audit requirements.
You have a dedicated IT operations team of 10 or more.
If none of those apply, the custom build serves you well for years.
The v1.1 additions
Photo upload for asset condition (intake and return photos). One CR.
QR code labels with a mobile-friendly scan page. Asset tag is the QR payload, the page shows current assignment and status. Two CRs.
Loaner pool management. Mark assets as "loaner" and track short-term assignments separately. One CR.
Integration with purchasing. New asset auto-created from approved purchase order. One CR with finance system integration.
Depreciation calculations. Annual depreciation per asset for accounting. One CR.
Each is incremental. Ship v1 first.
The deeper point
IT asset management exists in a strange middle ground. Big companies pay a lot for enterprise tools. Small companies use spreadsheets. There's no good off-the-shelf option for the middle.
Custom is now the answer for that middle. The cost of building has dropped to a week of focused effort. The cost of running is tens of dollars per month. The maintenance burden, with AI handling future CRs as needs evolve, is minimal.
This is a recurring pattern across internal tools. Wherever the off-the-shelf options are either too expensive or too thin, custom built with Avery is the new default. IT asset management is one of the clearest examples.