The problem
Training records start small. A spreadsheet holds employee name, course name, completion date, expiry date and a link to a certificate. That works for one site and one course. Then mandatory training grows. New hires need assignments before day one. Contractors need the same safety course as staff. People change roles and need new courses. Refresher cycles start. The spreadsheet is now a schedule, a file cabinet and a report, all in one file.
The failure modes are predictable. Rows get duplicated when two admins work on different copies. Names are spelled three ways. Date formats disagree. Expiry cells are blank. Someone filters for one team and forgets to clear it. A manager asks who is overdue for a refresher and no one trusts the answer. Certificates sit in a shared drive with file names like scan001.pdf. The spreadsheet records what happened, but it does not drive what should happen next.
A spreadsheet also cannot assign training. A row appears only after someone completes a course. The app should assign courses by role, site or start date, then track the completion. It should remind the employee before the due date and show the manager who is late. Manual reminders break when the admin is on leave. That gap is the real reason to replace the spreadsheet.
What a good solution looks like
A good app does four jobs. It assigns training, records completion, stores proof and reports status. Keep the scope there. Do not build a full learning platform. Course authoring, video hosting, quizzes and discussion forums are separate problems. For training records, the value is in a clean assignment list, a reliable due date and evidence you can open months later.
The data model should match the work. You need people, courses, course versions, assignments, completions and evidence files. Treat each completion as an event. Record who completed it, when, which course version, the expiry date and who approved the evidence. Course versions matter because a refresher for an old version may not count for the new one. Assignments should come from simple rules: role, site, start date, contractor status. Employees see their own training. Managers see their team. Admins see everything.
Useful features are plain. Sign in with your identity provider using SAML or OIDC. Role based access keeps managers inside their team. An audit log shows corrections and approvals. CSV import gets your current data in. CSV export gets reports out. Saved views make overdue and due soon lists one click away. Email reminders need a schedule, a retry rule and a log. Dashboards should answer two questions fast: who is overdue, and what evidence is missing.
How to build it
Start with the spreadsheet itself. List every column, who edits it, which reports people run and where the certificate files live. Pick one workflow for the first release, such as annual safety training for one group. Write down the fields and the rules in plain language. Get a sample file with real edge cases: a name change, a duplicate employee, a missing completion date and an expired certificate.
Build the import before the screens. Load the CSV into a staging table, map columns and validate rows. Check employee ID, course code and dates in ISO format. Flag duplicates and missing IDs. Show a reconciliation report: rows read, rows imported, rows rejected and why. Use a stable employee ID from your HR system, not a name. Keep the original file. If the import is wrong, the app is wrong from day one.
Then build the workflow. Employees get a My training page with due dates and status. They upload evidence with file type and size limits. Managers approve or reject with a note. Admins manage a course catalog with versions and renewal windows. An assignment rule table maps role, site and start date to courses. A daily reminder job sends email, retries failures and writes to a log. Every change goes to the audit log. Test with a small pilot group and run it beside the spreadsheet for one cycle.
Add integrations only after the core works. A nightly CSV sync from HR keeps people and roles current. An API or webhook can push completion events to your BI tool. A CSV export should include the full history, not just current rows. Set up backups and a staging environment. Write a runbook for imports, reminders and corrections. That runbook is part of the product.
Risks and how to manage them
Dirty data is the first risk. Duplicate people, missing employee IDs and course names that differ by a space will break reports. Clean the source before import. Use a staging table and a reconciliation report. Never hard delete a person or completion. Use soft delete and keep history. If a correction is needed, record the reason and the approver.
Expiry logic needs care. A certificate may expire from the issue date or from the completion date. A refresher may be allowed before expiry. A course version change may reset the rule. Test edge cases: a completion on the last day of the month, a leap day, a user in another time zone and an expiry date of today. Write the rules down and show them in the app. If the rule is hidden, people will not trust the due date.
Access and evidence need limits. Managers should see their team, not the whole company. Contractors may need a separate role. Evidence files can contain personal data, so set a retention rule and restrict downloads. Scan uploads and store them outside the public web root. Use signed links with short expiry. Review admin access on a schedule. Handle leavers the same day so reminders stop and records stay.
Adoption is the quiet risk. If managers still ask the admin for a list, the spreadsheet is still alive. Make the manager view the default path. Send a weekly overdue digest. Stop editing the spreadsheet after cutover and keep it read only. Train admins on corrections and exports. Watch the reminder log for bounces and failures. A tool nobody opens is worse than a spreadsheet everyone edits.
How to measure success
Pick a few measures before launch. Count overdue assignments, missing evidence and records without an expiry date. Track how long it takes to record a completion and how often reminders fail. Check that the monthly export matches the app. These are operational measures, not vanity metrics. Review them weekly for the first month, then monthly.
Ask the people who use it. Can a manager see who is late without asking? Can an employee find the right course and upload proof? Can an admin correct a date and keep the history? If the answer is no, fix that before adding features. A small app that handles one training workflow well beats a large suite that nobody understands.
You can build this in house, buy a small learning platform, or use a fixed scope build. The Cloudverg Internal tool sprint is $16,500 for a four week build of one workflow with sign in, roles, history, imports and exports. Compare that with your own build time and the cost of another year of manual reminders.
Frequently asked questions
How do I move training records from a spreadsheet to a web app?
Clean the spreadsheet first. Pick stable employee IDs, standard course codes and one date format. Import into a staging table, check the reconciliation report, then load the app. Run both systems for one training cycle before you stop editing the spreadsheet.
What should a training records app track?
Track the person, the course and the course version. Record the completion date, expiry date, evidence file, approver and notes. Keep an audit log of corrections. Add assignment rules by role, site or start date so people know what is due.
How should certificate expiry reminders work?
Set a reminder schedule before the expiry date, such as 60 and 14 days out. Send reminders to the employee and the manager. Log each send and retry failures. Show overdue items in a saved view so the admin does not rely on email alone.