Playbook

Replace your job costing spreadsheet with an app

Learn how to replace a shared job costing spreadsheet with a small web app, from data model and controls to rollout and success measures.

By the Cloudverg engineering team · · 6 min read

The problem

Job costing in a shared spreadsheet works until it does not. One tab holds the job list, another holds cost codes, and a third holds the entries someone typed after a supplier invoice arrives. The job number gets copied by hand. A hidden column holds the labor rate. The file is emailed as job_costing_final_v7.xlsx and then edited by two people at once.

Job costing also mixes things that should stay apart. A purchase order is a commitment, a supplier invoice is an actual cost, and a change order changes the contract value. In one sheet they all become rows with similar columns. Someone adds a formula to subtract committed from budget, another overwrites it, and the margin number on the summary tab no longer matches the detail.

Controls are thin. Anyone with the link can edit last month. There is no reliable change history, no way to limit payroll rates to finance, and no clean way to lock a closed job. Month end turns into a hunt for missing entries and a debate about which version is right.

What a good solution looks like

The app should have one record per job. That record holds the customer, job status, contract value, start and end dates, project manager, and the cost codes allowed on that job. Status matters: open, on hold, closed. Closed jobs should reject new cost entries unless an admin reopens them. This one rule prevents most late edits.

Cost entries are the core table. Each entry points to a job and a cost code, and carries a date, amount, quantity if relevant, vendor, source type, invoice or receipt reference, and a short note. Source type should be a fixed list: labor, material, subcontract, equipment, expense. Keep commitments in their own table so a purchase order does not look like a paid invoice. Change orders get their own table and a status of draft, approved, or rejected. Only approved change orders should change the contract value.

Access should follow roles. Project managers enter costs for their jobs. Finance sees all jobs and can approve change orders or reopen a closed job. Office admin can import vendor invoices. Nobody edits an entry without leaving an audit record. The app should store who changed what, when, and the old and new values. Use your identity provider for sign-in so leavers lose access when their account is disabled.

Reports should answer three questions fast: what is this job's cost to date, what is committed but not yet invoiced, and what is the expected margin. Build a job cost report with drill down to entries. Add a simple export to CSV and a feed to your finance or BI tool. Do not try to replace the general ledger. The app tracks job cost detail; accounting stays the book of record.

How to build it

Start by rebuilding the spreadsheet on paper. List every field, who owns it, and what rule applies. Separate facts from formulas. Contract value is a fact. Margin is a calculation. Decide which cost codes are allowed and who can add new ones. Freeze the list before build starts or you will get code sprawl in week one.

Use a relational database, such as Postgres, and a simple web framework your team can maintain. The schema can be small: jobs, cost_codes, cost_entries, commitments, change_orders, vendors, users, and audit_log. Put foreign keys on the cost entries. Add check constraints for positive amounts where that makes sense, and for valid status values. Store attachments in object storage with a link on the entry, not as blobs in the database.

Build the workflow end to end for one job type first. A project manager creates or opens a job, adds a cost entry, attaches a receipt, and submits it. Finance reviews a queue, approves or returns it, and the job report updates. Add server side validation, not only form checks. Test the import with a copy of the real spreadsheet, including blank rows, merged cells, and duplicate invoice numbers. Import only open jobs and a summary of closed jobs.

Roll out in a controlled way. Run the app and the spreadsheet in parallel for one month end. Reconcile the app total for each job to the accounting ledger and explain every difference. Train on the actual screens, not a slide deck. After reconciliation, make the spreadsheet read only and move it to an archive folder. Keep a named owner for the app and a short runbook for imports, exports, and access changes.

Risks and how to manage them

Duplicate entries are the first risk. A supplier invoice gets entered by the office and again by the project manager. Add a unique check on vendor plus invoice number plus job where that fits your process. Show recent entries for the same vendor before someone saves a new one. Make the approval queue visible so two people do not review the same item.

Cost code sprawl is the second. Every new job tempts someone to add a code. Keep the code list short and owned by finance. Allow new codes only through an admin screen with a reason field. Report on codes with no activity each quarter and retire them. Misclassification is a training issue, so put the code descriptions on the entry form and review a sample of entries each month.

Reconciliation drift with accounting is the third. The app will never match the ledger by magic. Decide which side wins and how often you reconcile. Common causes are timing, tax lines, freight, and credits. Record an adjustment note in the app when you find a break. Do not hide differences in a plug row.

Access and overbuilding are the last pair. Payroll rates and margins should be restricted. Test that a project manager cannot see another manager's job or the labor rate table. Keep scope tight: one workflow, one report, one export. A job costing app that tries to become ERP will stall. Add features only after the first month end is clean.

How to measure success

Measure before you build. Time how long it takes to produce the job cost report at month end. Count how many versions of the file exist. Count the reconciliation breaks between the spreadsheet and the ledger. Ask the project managers how many cost entries they are holding until month end. These numbers become your baseline.

After launch, track days to close the month for job costs. Track the number of adjustments made after a job is marked closed. Track how often an entry is returned for missing vendor or invoice reference. Track the age of the oldest unapproved cost entry. These are operational signals, not vanity metrics.

Check adoption by looking at entry dates. Costs should be entered within a few days of the invoice or timesheet, not saved for a batch import. Look at how many jobs have no entries for the current week. Ask finance whether they still keep a personal copy of the spreadsheet. If they do, you have not finished.

Use finance trust as the final test. The job cost report should match the ledger after known adjustments. An auditor or controller should be able to answer who changed a cost entry and why in under a minute. When the spreadsheet is read only and nobody asks for the old file, the replacement is done. If you want help, Cloudverg's Internal tool sprint is a fixed price of $16,500 and runs four weeks, with sign-in, roles, audit trail, import, exports, training, and a runbook. It is one option among others.

Frequently asked questions

Can we build job costing in a low-code tool instead of custom code?

Yes, if the process is simple and one team owns it. Low-code tools can handle forms and basic reports, but job costing needs clean relations between jobs, cost codes, commitments, and change orders. Check roles, audit history, import limits, and export options before you commit. A small custom app is often easier when those controls matter.

Should the job costing app replace our accounting system?

No. Keep the general ledger in your accounting system and use the app for job cost detail, commitments, and change orders. Reconcile the two at each month end and record the reason for every difference. The app should export clean data, not become a second set of books.

How much history should we import?

Import all open jobs with their cost entries and approved change orders. For closed jobs, import a summary row per job so reports and searches still work. Do not import years of paid invoices unless someone has a clear use for them. A smaller import is easier to check and faster to correct.

Fixed price

Want help with this? Internal tool sprint

$16,500 fixed price

4 weeks · Starts within 10 business days

Four weeks to replace one spreadsheet process with a working internal tool your team signs into, with roles, history and exports.

What is included

Related guides

More custom software guides   Custom software

Smallest way to start

Get a senior architect on your problem this week

Ninety minutes on the cloud, AI or security question that is blocking you, a pre-read of your material and a written summary within two business days.

$450 one-time