An auditor asks for a supplier contract signed three years ago, and nobody remembers which cabinet it went into. Or a box of old invoices turns out to be water-damaged. Problems like these push small and mid-sized companies toward digitizing their archives, and then the questions start: where do you begin, and do you really need to scan everything?
This guide walks through the process step by step: sorting documents, setting scan standards, defining file names and metadata, controlling access, backing up properly, and, if you are a developer, designing your own document system in Laravel.
1. Inventory First, Scan Later
The most common mistake is scanning an entire storeroom without any selection, which produces thousands of files nobody opens. Start with a simple spreadsheet inventory: document type, physical location, year range, estimated page count, and how often it is requested.
Then split everything into three groups:
- Active: frequently needed, such as current contracts, active employee files, and this year's invoices. Digitize these first.
- Inactive but legally retained: older financial records and supporting documents. Digitize gradually.
- Eligible for disposal: past their retention period with no legal value. Do not scan them; record their destruction instead.
Retention periods depend on your country and document type. Tax and accounting records are commonly required for several years, and some originals, such as notarized deeds or certificates, keep their legal value only on paper. Confirm the final list with your accountant or legal advisor before you destroy anything.
2. Scanning and OCR Standards
Write the standard down before the first page is scanned, so results stay consistent even with several operators.
| Document type | Resolution | Color | Format |
|---|---|---|---|
| Letters, invoices, text contracts | 300 dpi | Grayscale | Searchable PDF (OCR) |
| Stamped or wet-signed documents | 300 dpi | Color | PDF/A |
| Photos, drawings, floor plans | 400-600 dpi | Color | TIFF master, PDF for access |
| Small receipts | 300 dpi | Grayscale | PDF, several per page is fine |
PDF/A is the archival flavor of PDF: fonts are embedded and nothing depends on external resources. OCR adds a text layer so scans become searchable. Many document scanners include OCR; if yours does not, the free tool OCRmyPDF, built on Tesseract, can add a text layer to existing PDFs in dozens of languages.
A scanner with an automatic document feeder and duplex scanning is far more efficient than a flatbed. Phone scanning apps are fine for small volumes but less consistent for official records.
Estimate the workload before you start so the timeline is realistic. Suppose your priority archive is about 20,000 pages, and one operator with a feeder scanner handles roughly 1,500 pages a day once you include removing staples, flattening paper, and entering metadata. That works out to three to four working weeks. These numbers are only an example; time your own team on day one and adjust. Budget extra time for fragile or oversized documents, which cannot go through a feeder and must be scanned one by one on a flatbed.
3. File Naming and Metadata
Consistent file names are your first search layer, even before you have dedicated software:
[DATE]_[TYPE]_[PARTY]_[NUMBER].pdf
2026-03-14_CONTRACT_ACME-SUPPLY_CTR-0231.pdf
2026-03-20_INVOICE_NORTHWIND_INV-1187.pdf
2025-12-01_EMPLOYMENT_JANE-DOE_HR-045.pdf
Putting an ISO date first makes files sort chronologically. Avoid spaces and special characters so files move cleanly between systems.
Beyond the name, record at least: category, document date, counterparty, document number, owning department, confidentiality level, physical location if the original is kept, and retention end date. That metadata is what lets you answer "every contract with Acme expiring this year" in seconds.
4. Access Control and Audit Trail
- Classify documents by confidentiality, for example Public, Internal, Confidential.
- Grant access by role or department rather than by individual, so staff changes are easy to handle.
- Log every view, download, and delete in an audit trail regular users cannot edit.
- Disable accounts of departing employees on their last day.
- For files containing personal data, follow the privacy law that applies to you, such as GDPR in the EU.
5. Back Up with the 3-2-1 Rule
Moving everything onto one external drive just moves the risk. Keep three copies, on two different media, with one copy offsite. For example: primary files on an office NAS, daily sync to cloud storage, and a monthly drive stored elsewhere. Test a restore at least once a quarter; an untested backup is a hope, not a plan.
6. Choosing a System
| Option | Fits | Drawback |
|---|---|---|
| Google Drive or OneDrive folders | Small teams, hundreds of files | Limited metadata, permissions drift |
| Off-the-shelf document management system | Companies needing approval workflows | Recurring license fees, limited customization |
| Custom-built archive app | Special metadata or integration needs | Requires a developer and maintenance |
7. For Developers: A Laravel Document Table
If you build your own, start with a table that holds metadata and OCR text. Sketch the relationships first, as in designing a simple ERD, then write the migration:
Schema::create('documents', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('doc_number')->nullable()->index();
$table->foreignId('category_id')->constrained();
$table->foreignId('department_id')->constrained();
$table->date('doc_date');
$table->string('counterparty')->nullable();
$table->enum('confidentiality', ['public', 'internal', 'secret'])->default('internal');
$table->string('file_path');
$table->string('physical_location')->nullable();
$table->date('retain_until')->nullable();
$table->longText('ocr_text')->nullable();
$table->foreignId('uploaded_by')->constrained('users');
$table->timestamps();
$table->softDeletes();
$table->fullText(['title', 'ocr_text']);
});
- Store files on a private disk. In Laravel 11 the
localdisk points tostorage/app/private. Serve files only through a route that checks permission, for exampleGate::authorize('view', $doc)followed byStorage::disk('local')->download($doc->file_path). - A fulltext index on title and OCR text enables
Document::whereFullText(['title', 'ocr_text'], $keyword)on MySQL. - Soft deletes protect against accidental permanent loss.
retain_untillets a scheduled command email admins a monthly list of documents due for review and disposal.
Keep an audit log in a separate document_activities table, and run OCR for large files on a queue so uploads stay fast. Validate file types and sizes as described in our web security best practices.
Project Checklist
- Inventory complete and priorities agreed.
- Retention periods per document type confirmed with legal or tax advisors.
- Scan standard written down and shared with operators.
- File naming pattern and required metadata defined.
- Role-based access and audit logging enabled.
- 3-2-1 backups running and a restore tested.
- A procedure for new documents so paper does not pile up again.
That last item is the one teams forget. A digitization project only sticks when new documents enter the system on day one instead of being scanned a year later. To see how an archive fits into a broader business system, read how to digitize a small business with an information system.