A drafting & engineering firm was running their entire pipeline — revenue, job status, ownership — out of a single, shared, ever-growing Excel file. Multiple people. Same file. Daily merge conflicts. We rebuilt it as a role-based web app, with files living in their existing Egnyte storage and staying perfectly in sync.
On paper, the spreadsheet was just a tool. In practice, it was the system of record for jobs, ownership, revenue, and project state — the thing the entire firm depended on to know what was happening, and what they were getting paid for.
That came with all the usual costs:
The team didn't want to migrate off Egnyte — that was already their source of truth for drawings, deliverables, and client files. The win wasn't replacing Egnyte; it was making the job tracker speak to it natively.
The whole project was built around one principle: if a job exists in the app, the matching folder structure exists in Egnyte — and vice versa. No drift. No "where did that file go?" Slack messages.
// When a job is created in the app, mirror it in Egnyte
public function createJob($payload) {
$job = $this->jobs->insert($payload);
// Provision the canonical folder tree
$this->egnyte->createFolderTree([
'/Jobs/' . $job->number . '/',
'/Jobs/' . $job->number . '/01_Drawings',
'/Jobs/' . $job->number . '/02_Deliverables',
'/Jobs/' . $job->number . '/03_Client_Comms',
]);
// Map app roles to Egnyte permissions
$this->egnyte->applyPermissions($job, [
'admin' => 'full',
'engineer' => 'editor',
'readonly' => 'viewer',
]);
return $job;
}
Simplified, but representative. Every job in the app has a guaranteed home in Egnyte — same names, same structure, every time.
Admins, engineers, and read-only stakeholders each get a tailored view. Permissions can't be "accidentally" granted by sending a file.
Imported the existing spreadsheet of in-flight jobs in one pass — including matching them up to their existing Egnyte folders.
When a job's status, owner, or revenue changes, every user sees it immediately. No "refresh the file."
Creating a job in the app instantly provisions a structured folder tree in Egnyte. Drawings, deliverables, client comms — always in the same place.
Revenue by status, owner, and timeframe — calculated live, never stale, never wrong because someone broke a SUMIF.
Every change attributed to a user with a timestamp. No more "who set this to Done last night?" mysteries.
Drafting firms aren't interested in framework-of-the-month. They want something that works in five years and that another developer can pick up if needed. We built on a battle-tested stack with a clean separation between the app and the Egnyte sync layer.
Mapped the actual life of a job from quoting through delivery. Identified the Egnyte folder convention they were already (mostly) using.
Designed the data model around jobs, users, roles, and audit events. Built a secure login + permission layer first.
Wrote the integration that creates, mirrors, and permission-maps job folders inside Egnyte automatically.
Imported their live spreadsheet, reconciled it with existing Egnyte folders, trained the team, and went live without a hiccup.
Job status and revenue update for everyone the second they change.
Users edit at the same time without overwriting each other's work.
Jobs and files in lockstep — always — between app & Egnyte.
Revenue and pipeline numbers come from the system, not a person re-summing the sheet.
The biggest win wasn't even the dashboard — it was that we stopped having three versions of "the file." Everything just lives in the app and Egnyte now, and it's always in sync.
Exact numbers vary by team size and workflow, but for firms moving off a shared master spreadsheet, these are common outcomes we see after rollout.
Want a custom estimate for your team? We can map your current workflow and provide a practical ROI range.
If you're a drafting, engineering, AEC, or services firm with a "master" sheet that everyone fights over, you're a great candidate for this kind of build.